@yelon/bis 17.2.1 → 17.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/index.d.ts +5 -0
- package/config/public_api.d.ts +1 -0
- package/esm2022/bis.mjs +2 -2
- package/esm2022/{layout → config}/bis.config.mjs +1 -1
- package/esm2022/config/config.mjs +5 -0
- package/esm2022/config/public_api.mjs +2 -0
- package/esm2022/layout/layout-basic.component.mjs +376 -0
- package/esm2022/layout/layout-nav-application.component.mjs +368 -0
- package/esm2022/layout/layout-nav-group.component.mjs +160 -0
- package/esm2022/layout/layout-nav-tile.component.mjs +15 -0
- package/esm2022/layout/layout.module.mjs +54 -0
- package/esm2022/layout/public_api.mjs +6 -14
- package/esm2022/public_api.mjs +9 -2
- package/esm2022/src/bis.module.mjs +17 -0
- package/esm2022/src/helper.mjs +45 -0
- package/esm2022/src/provide.mjs +8 -0
- package/esm2022/src/refresh-token.mjs +79 -0
- package/esm2022/src/startup.service.mjs +184 -0
- package/esm2022/src/yunzai-act.guard.mjs +88 -0
- package/esm2022/src/yunzai-analysis-addon.guard.mjs +99 -0
- package/esm2022/src/yunzai-default.interceptor.mjs +63 -0
- package/esm2022/yunzai-widgets/public_api.mjs +7 -0
- package/esm2022/yunzai-widgets/yunzai-clear-storage.component.mjs +47 -0
- package/esm2022/yunzai-widgets/yunzai-fullscreen.component.mjs +47 -0
- package/esm2022/yunzai-widgets/yunzai-i18n.component.mjs +139 -0
- package/esm2022/yunzai-widgets/yunzai-notify.component.mjs +180 -0
- package/esm2022/yunzai-widgets/yunzai-user.component.mjs +120 -0
- package/esm2022/yunzai-widgets/yunzai-widget.module.mjs +62 -0
- package/esm2022/yunzai-widgets/yunzai-widgets.mjs +5 -0
- package/fesm2022/bis.mjs +554 -1
- package/fesm2022/bis.mjs.map +1 -1
- package/fesm2022/config.mjs +21 -0
- package/fesm2022/config.mjs.map +1 -0
- package/fesm2022/layout.mjs +396 -2781
- package/fesm2022/layout.mjs.map +1 -1
- package/fesm2022/yunzai-widgets.mjs +563 -0
- package/fesm2022/yunzai-widgets.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/layout/{layout-basic/layout-basic.component.d.ts → layout-basic.component.d.ts} +12 -8
- package/layout/layout-nav-application.component.d.ts +26 -0
- package/layout/layout-nav-group.component.d.ts +14 -0
- package/layout/layout-nav-tile.component.d.ts +5 -0
- package/layout/layout.module.d.ts +18 -0
- package/layout/public_api.d.ts +5 -13
- package/package.json +40 -11
- package/public_api.d.ts +8 -2
- package/src/bis.module.d.ts +8 -0
- package/src/helper.d.ts +16 -0
- package/src/provide.d.ts +2 -0
- package/src/refresh-token.d.ts +6 -0
- package/src/startup.service.d.ts +24 -0
- package/src/yunzai-default.interceptor.d.ts +2 -0
- package/yunzai-widgets/index.d.ts +5 -0
- package/{layout/widgets/index.d.ts → yunzai-widgets/public_api.d.ts} +2 -2
- package/yunzai-widgets/yunzai-clear-storage.component.d.ts +8 -0
- package/yunzai-widgets/yunzai-fullscreen.component.d.ts +8 -0
- package/yunzai-widgets/yunzai-i18n.component.d.ts +19 -0
- package/yunzai-widgets/yunzai-notify.component.d.ts +25 -0
- package/yunzai-widgets/yunzai-user.component.d.ts +22 -0
- package/yunzai-widgets/yunzai-widget.module.d.ts +18 -0
- package/README.md +0 -23
- package/esm2022/index.mjs +0 -2
- package/esm2022/layout/html-names.mjs +0 -33
- package/esm2022/layout/icon/style-icons.mjs +0 -796
- package/esm2022/layout/layout-basic/index.mjs +0 -3
- package/esm2022/layout/layout-basic/interface.mjs +0 -2
- package/esm2022/layout/layout-basic/layout-basic.component.mjs +0 -368
- package/esm2022/layout/layout-nav/index.mjs +0 -4
- package/esm2022/layout/layout-nav/layout-nav-application.component.mjs +0 -382
- package/esm2022/layout/layout-nav/layout-nav-group.component.mjs +0 -122
- package/esm2022/layout/layout-nav/layout-nav-tile.component.mjs +0 -15
- package/esm2022/layout/widgets/index.mjs +0 -7
- package/esm2022/layout/widgets/yunzai-clear-storage.component.mjs +0 -44
- package/esm2022/layout/widgets/yunzai-fullscreen.component.mjs +0 -44
- package/esm2022/layout/widgets/yunzai-i18n.component.mjs +0 -140
- package/esm2022/layout/widgets/yunzai-notify.component.mjs +0 -185
- package/esm2022/layout/widgets/yunzai-theme-btn.component.mjs +0 -200
- package/esm2022/layout/widgets/yunzai-user.component.mjs +0 -129
- package/esm2022/layout/yunzai-act.guard.mjs +0 -88
- package/esm2022/layout/yunzai-analysis-addon.guard.mjs +0 -100
- package/esm2022/layout/yunzai-auth.service.mjs +0 -108
- package/esm2022/layout/yunzai-default.interceptor.mjs +0 -201
- package/esm2022/layout/yunzai-i18n.service.mjs +0 -107
- package/esm2022/layout/yunzai-lang.mjs +0 -114
- package/esm2022/layout/yunzai-layout.module.mjs +0 -118
- package/esm2022/layout/yunzai-startup.service.mjs +0 -152
- package/layout/html-names.d.ts +0 -31
- package/layout/icon/style-icons.d.ts +0 -1
- package/layout/layout-basic/index.d.ts +0 -2
- package/layout/layout-basic/interface.d.ts +0 -8
- package/layout/layout-nav/index.d.ts +0 -3
- package/layout/layout-nav/layout-nav-application.component.d.ts +0 -32
- package/layout/layout-nav/layout-nav-group.component.d.ts +0 -16
- package/layout/layout-nav/layout-nav-tile.component.d.ts +0 -6
- package/layout/widgets/yunzai-clear-storage.component.d.ts +0 -11
- package/layout/widgets/yunzai-fullscreen.component.d.ts +0 -8
- package/layout/widgets/yunzai-i18n.component.d.ts +0 -22
- package/layout/widgets/yunzai-notify.component.d.ts +0 -30
- package/layout/widgets/yunzai-theme-btn.component.d.ts +0 -32
- package/layout/widgets/yunzai-user.component.d.ts +0 -26
- package/layout/yunzai-auth.service.d.ts +0 -19
- package/layout/yunzai-default.interceptor.d.ts +0 -28
- package/layout/yunzai-i18n.service.d.ts +0 -27
- package/layout/yunzai-lang.d.ts +0 -12
- package/layout/yunzai-layout.module.d.ts +0 -30
- package/layout/yunzai-startup.service.d.ts +0 -34
- /package/{layout → config}/bis.config.d.ts +0 -0
- /package/{layout → src}/yunzai-act.guard.d.ts +0 -0
- /package/{layout → src}/yunzai-analysis-addon.guard.d.ts +0 -0
package/fesm2022/bis.mjs
CHANGED
|
@@ -1,6 +1,559 @@
|
|
|
1
|
-
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { NgModule, importProvidersFrom, makeEnvironmentProviders, inject, APP_INITIALIZER, Injector, Injectable, Inject } from '@angular/core';
|
|
3
|
+
import { YunzaiLayoutModule } from '@yelon/bis/layout';
|
|
4
|
+
import { YunzaiWidgetsModule } from '@yelon/bis/yunzai-widgets';
|
|
5
|
+
import * as i2 from '@angular/router';
|
|
6
|
+
import { Router } from '@angular/router';
|
|
7
|
+
import { YA_SERVICE_TOKEN } from '@yelon/auth';
|
|
8
|
+
import { YUNZAI_I18N_TOKEN, IGNORE_BASE_URL, MenuService, TitleService, SettingsService } from '@yelon/theme';
|
|
9
|
+
import { NzNotificationService } from 'ng-zorro-antd/notification';
|
|
10
|
+
import { HttpClient, HttpErrorResponse, HttpResponseBase } from '@angular/common/http';
|
|
11
|
+
import { BehaviorSubject, throwError, filter, take, switchMap, catchError, of, mergeMap, combineLatest, map } from 'rxjs';
|
|
12
|
+
import { mergeBisConfig, BUSINESS_DEFAULT_CONFIG } from '@yelon/bis/config';
|
|
13
|
+
import * as i1 from '@yelon/util';
|
|
14
|
+
import { log, YUNZAI_CONFIG, YunzaiConfigService, WINDOW, useLocalStorageTenant, useLocalStorageUser, useLocalStorageHeader, useLocalStorageProjectInfo, useLocalStorageDefaultRoute, useLocalStorageCurrent, deepCopy } from '@yelon/util';
|
|
15
|
+
import { ACLService } from '@yelon/acl';
|
|
16
|
+
|
|
17
|
+
class BisModule {
|
|
18
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: BisModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
19
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.2.1", ngImport: i0, type: BisModule, imports: [YunzaiLayoutModule, YunzaiWidgetsModule], exports: [YunzaiLayoutModule, YunzaiWidgetsModule] }); }
|
|
20
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: BisModule, imports: [YunzaiLayoutModule, YunzaiWidgetsModule, YunzaiLayoutModule, YunzaiWidgetsModule] }); }
|
|
21
|
+
}
|
|
22
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: BisModule, decorators: [{
|
|
23
|
+
type: NgModule,
|
|
24
|
+
args: [{
|
|
25
|
+
imports: [YunzaiLayoutModule, YunzaiWidgetsModule],
|
|
26
|
+
exports: [YunzaiLayoutModule, YunzaiWidgetsModule]
|
|
27
|
+
}]
|
|
28
|
+
}] });
|
|
29
|
+
|
|
30
|
+
function provideYunzaiBis() {
|
|
31
|
+
const provides = [];
|
|
32
|
+
provides.push(importProvidersFrom(BisModule));
|
|
33
|
+
return makeEnvironmentProviders(provides);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const CODEMESSAGE = {
|
|
37
|
+
200: '服务器成功返回请求的数据。',
|
|
38
|
+
201: '新建或修改数据成功。',
|
|
39
|
+
202: '一个请求已经进入后台排队(异步任务)。',
|
|
40
|
+
204: '删除数据成功。',
|
|
41
|
+
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
|
|
42
|
+
401: '用户没有权限(令牌、用户名、密码错误)。',
|
|
43
|
+
403: '用户得到授权,但是访问是被禁止的。',
|
|
44
|
+
404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
|
|
45
|
+
406: '请求的格式不可得。',
|
|
46
|
+
410: '请求的资源被永久删除,且不会再得到的。',
|
|
47
|
+
422: '当创建一个对象时,发生一个验证错误。',
|
|
48
|
+
500: '服务器发生错误,请检查服务器。',
|
|
49
|
+
502: '网关错误。',
|
|
50
|
+
503: '服务不可用,服务器暂时过载或维护。',
|
|
51
|
+
504: '网关超时。'
|
|
52
|
+
};
|
|
53
|
+
function getAdditionalHeaders(headers) {
|
|
54
|
+
const res = {};
|
|
55
|
+
const lang = inject(YUNZAI_I18N_TOKEN).currentLang;
|
|
56
|
+
if (!headers?.has('Accept-Language') && lang) {
|
|
57
|
+
res['Accept-Language'] = lang;
|
|
58
|
+
}
|
|
59
|
+
return res;
|
|
60
|
+
}
|
|
61
|
+
function checkStatus(injector, ev) {
|
|
62
|
+
if ((ev.status >= 200 && ev.status < 300) || ev.status === 401) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const errortext = CODEMESSAGE[ev.status] || ev.statusText;
|
|
66
|
+
injector.get(NzNotificationService).error(`请求错误 ${ev.status}: ${ev.url}`, errortext);
|
|
67
|
+
}
|
|
68
|
+
function goTo(injector, url) {
|
|
69
|
+
setTimeout(() => injector.get(Router).navigateByUrl(url));
|
|
70
|
+
}
|
|
71
|
+
function toLogin(injector) {
|
|
72
|
+
injector.get(NzNotificationService).error(`未登录或登录已过期,请重新登录。`, ``);
|
|
73
|
+
goTo(injector, injector.get(YA_SERVICE_TOKEN).login_url);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
let refreshToking = false;
|
|
77
|
+
let refreshToken$ = new BehaviorSubject(null);
|
|
78
|
+
const tryRefreshToken = (injector, ev, req, next) => {
|
|
79
|
+
// 连刷新Token的请求都错了,那就是真错了
|
|
80
|
+
if (['/auth/oauth/getOrCreateToken/webapp'].some(url => req.url.includes(url))) {
|
|
81
|
+
toLogin(injector);
|
|
82
|
+
return throwError(() => ev);
|
|
83
|
+
}
|
|
84
|
+
// 2、如果 `refreshToking` 为 `true` 表示已经在请求刷新 Token 中,后续所有请求转入等待状态,直至结果返回后再重新发起请求
|
|
85
|
+
if (refreshToking) {
|
|
86
|
+
return refreshToken$.pipe(filter(v => !!v), take(1), switchMap(() => next(reAttachToken(injector, req))));
|
|
87
|
+
}
|
|
88
|
+
// 3、尝试调用刷新 Token
|
|
89
|
+
refreshToking = true;
|
|
90
|
+
refreshToken$.next(null);
|
|
91
|
+
return refreshTokenRequest(injector).pipe(switchMap(res => {
|
|
92
|
+
// 通知后续请求继续执行
|
|
93
|
+
refreshToking = false;
|
|
94
|
+
refreshToken$.next(res);
|
|
95
|
+
// 重新保存新 token
|
|
96
|
+
injector.get(YA_SERVICE_TOKEN).set(res);
|
|
97
|
+
// 重新发起请求
|
|
98
|
+
return next(reAttachToken(injector, req));
|
|
99
|
+
}), catchError(err => {
|
|
100
|
+
refreshToking = false;
|
|
101
|
+
toLogin(injector);
|
|
102
|
+
return throwError(() => err);
|
|
103
|
+
}));
|
|
104
|
+
};
|
|
105
|
+
function reAttachToken(injector, req) {
|
|
106
|
+
const token = injector.get(YA_SERVICE_TOKEN).get()?.access_token;
|
|
107
|
+
return req.clone({
|
|
108
|
+
setHeaders: {
|
|
109
|
+
Authorization: `Bearer ${token}`
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function refreshTokenRequest(injector) {
|
|
114
|
+
const model = injector.get(YA_SERVICE_TOKEN).get();
|
|
115
|
+
const form = new FormData();
|
|
116
|
+
form.set('refresh_token', model?.refresh_token);
|
|
117
|
+
form.set('grant_type', 'refresh_token');
|
|
118
|
+
form.set('scope', 'webapp');
|
|
119
|
+
return injector.get(HttpClient).post(`/auth/oauth/getOrCreateToken/webapp`, form);
|
|
120
|
+
}
|
|
121
|
+
function buildAuthRefresh(injector) {
|
|
122
|
+
const tokenSrv = injector.get(YA_SERVICE_TOKEN);
|
|
123
|
+
tokenSrv.refresh
|
|
124
|
+
.pipe(filter(() => !refreshToking), switchMap(res => {
|
|
125
|
+
log(res);
|
|
126
|
+
refreshToking = true;
|
|
127
|
+
return refreshTokenRequest(injector);
|
|
128
|
+
}))
|
|
129
|
+
.subscribe({
|
|
130
|
+
next: res => {
|
|
131
|
+
res.expired = +new Date() + 1000 * 60 * 5;
|
|
132
|
+
refreshToking = false;
|
|
133
|
+
tokenSrv.set(res);
|
|
134
|
+
},
|
|
135
|
+
error: () => toLogin(injector)
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
function provideYunzaiBindAuthRefresh() {
|
|
139
|
+
return [
|
|
140
|
+
{
|
|
141
|
+
provide: APP_INITIALIZER,
|
|
142
|
+
useFactory: (injector) => () => buildAuthRefresh(injector),
|
|
143
|
+
deps: [Injector],
|
|
144
|
+
multi: true
|
|
145
|
+
}
|
|
146
|
+
];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function handleData(injector, ev, req, next) {
|
|
150
|
+
checkStatus(injector, ev);
|
|
151
|
+
const config = injector.get(YUNZAI_CONFIG).bis;
|
|
152
|
+
switch (ev.status) {
|
|
153
|
+
case 200:
|
|
154
|
+
return of(ev);
|
|
155
|
+
case 401:
|
|
156
|
+
if (config.refreshTokenEnabled && config.refreshTokenType === 're-request') {
|
|
157
|
+
const unAuthorizationReq = req.clone();
|
|
158
|
+
unAuthorizationReq.headers.delete('Authorization');
|
|
159
|
+
return tryRefreshToken(injector, ev, unAuthorizationReq, next);
|
|
160
|
+
}
|
|
161
|
+
toLogin(injector);
|
|
162
|
+
break;
|
|
163
|
+
case 403:
|
|
164
|
+
case 404:
|
|
165
|
+
case 500:
|
|
166
|
+
goTo(injector, `/exception/${ev.status}?url=${req.urlWithParams}`);
|
|
167
|
+
break;
|
|
168
|
+
default:
|
|
169
|
+
if (ev instanceof HttpErrorResponse) {
|
|
170
|
+
console.warn('未可知错误,大部分是由于后端不支持跨域CORS或无效配置引起,请参考 https://ng.yunzainfo.com/docs/server 解决跨域问题', ev);
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
if (ev instanceof HttpErrorResponse) {
|
|
175
|
+
return throwError(() => ev);
|
|
176
|
+
}
|
|
177
|
+
else if (ev._throw) {
|
|
178
|
+
return throwError(() => ev.body);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
return of(ev);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const yunzaiDefaultInterceptor = (req, next) => {
|
|
185
|
+
const config = mergeBisConfig(inject(YunzaiConfigService));
|
|
186
|
+
const { baseUrl } = config;
|
|
187
|
+
let url = req.url;
|
|
188
|
+
if (!req.context.get(IGNORE_BASE_URL) && !url.startsWith('https://') && !url.startsWith('http://')) {
|
|
189
|
+
url = baseUrl + (baseUrl.endsWith('/') && url.startsWith('/') ? url.substring(1) : url);
|
|
190
|
+
}
|
|
191
|
+
if (url.includes('.json') && url.includes('assets')) {
|
|
192
|
+
url = req.url;
|
|
193
|
+
}
|
|
194
|
+
const newReq = req.clone({ url, setHeaders: getAdditionalHeaders(req.headers) });
|
|
195
|
+
const injector = inject(Injector);
|
|
196
|
+
return next(newReq).pipe(mergeMap(ev => {
|
|
197
|
+
if (ev instanceof HttpResponseBase) {
|
|
198
|
+
return handleData(injector, ev, newReq, next);
|
|
199
|
+
}
|
|
200
|
+
return of(ev);
|
|
201
|
+
}), catchError((err) => handleData(injector, err, newReq, next)));
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
function provideYunzaiStartup() {
|
|
205
|
+
return [
|
|
206
|
+
YunzaiStartupService,
|
|
207
|
+
{
|
|
208
|
+
provide: APP_INITIALIZER,
|
|
209
|
+
useFactory: (startupService) => () => startupService.load(),
|
|
210
|
+
deps: [YunzaiStartupService],
|
|
211
|
+
multi: true
|
|
212
|
+
}
|
|
213
|
+
];
|
|
214
|
+
}
|
|
215
|
+
class YunzaiStartupService {
|
|
216
|
+
constructor() {
|
|
217
|
+
this.config = mergeBisConfig(inject(YunzaiConfigService));
|
|
218
|
+
this.menuService = inject(MenuService);
|
|
219
|
+
this.aclService = inject(ACLService);
|
|
220
|
+
this.titleService = inject(TitleService);
|
|
221
|
+
this.tokenService = inject(YA_SERVICE_TOKEN);
|
|
222
|
+
this.httpClient = inject(HttpClient);
|
|
223
|
+
this.settingService = inject(SettingsService);
|
|
224
|
+
this.i18n = inject(YUNZAI_I18N_TOKEN);
|
|
225
|
+
this.win = inject(WINDOW);
|
|
226
|
+
this.configService = inject(YunzaiConfigService);
|
|
227
|
+
}
|
|
228
|
+
load() {
|
|
229
|
+
let defaultLang = this.settingService.layout.lang || this.i18n.defaultLang;
|
|
230
|
+
const [setTenant] = useLocalStorageTenant();
|
|
231
|
+
const [setUser, getUser] = useLocalStorageUser();
|
|
232
|
+
const [setHeader] = useLocalStorageHeader();
|
|
233
|
+
const [setProject] = useLocalStorageProjectInfo();
|
|
234
|
+
const [setDefaultRoute] = useLocalStorageDefaultRoute();
|
|
235
|
+
const [setCurrent] = useLocalStorageCurrent();
|
|
236
|
+
return this.token().pipe(mergeMap((token) => {
|
|
237
|
+
this.configService.set('auth', {
|
|
238
|
+
token_send_key: 'Authorization',
|
|
239
|
+
token_send_template: `${token.token_type} \${access_token}`,
|
|
240
|
+
token_send_place: 'header'
|
|
241
|
+
});
|
|
242
|
+
this.tokenService.set(token);
|
|
243
|
+
return of(void 0);
|
|
244
|
+
}), mergeMap(() => {
|
|
245
|
+
return combineLatest([
|
|
246
|
+
this.httpClient.get(`/auth/user`),
|
|
247
|
+
this.httpClient.get(`/auth/allheader/v2`),
|
|
248
|
+
this.httpClient.get(`/app-manager/project/info`)
|
|
249
|
+
]).pipe(map(([user, header, project]) => {
|
|
250
|
+
setUser(user.principal);
|
|
251
|
+
setTenant(user.tenantId);
|
|
252
|
+
setHeader(header.data);
|
|
253
|
+
setProject(project.data);
|
|
254
|
+
return void 0;
|
|
255
|
+
}));
|
|
256
|
+
}), mergeMap(() => {
|
|
257
|
+
return this.i18n.loadLangData(defaultLang).pipe(map((langData) => {
|
|
258
|
+
this.i18n.use(defaultLang, langData);
|
|
259
|
+
return void 0;
|
|
260
|
+
}));
|
|
261
|
+
}), mergeMap(() => {
|
|
262
|
+
const yunzaiUser = getUser();
|
|
263
|
+
const yunzaiMenus = deepCopy(yunzaiUser.menu).filter(m => m.systemCode && m.systemCode === this.config.systemCode);
|
|
264
|
+
const currentMenu = yunzaiMenus.pop();
|
|
265
|
+
if (currentMenu) {
|
|
266
|
+
this.settingService.setApp({ name: currentMenu.text, description: currentMenu.intro });
|
|
267
|
+
this.settingService.setUser({
|
|
268
|
+
name: yunzaiUser.realname,
|
|
269
|
+
avatar: `${this.config.baseUrl}/filecenter/file/${yunzaiUser.avatarId}` || '',
|
|
270
|
+
email: yunzaiUser.email
|
|
271
|
+
});
|
|
272
|
+
this.titleService.default = currentMenu && currentMenu.text ? currentMenu.text : 'default application name';
|
|
273
|
+
this.titleService.setTitle(currentMenu && currentMenu.text ? currentMenu.text : 'no title');
|
|
274
|
+
const abilities = [];
|
|
275
|
+
generateAbility([currentMenu], abilities, '');
|
|
276
|
+
this.aclService.attachRole(yunzaiUser?.roles
|
|
277
|
+
.map((role) => {
|
|
278
|
+
return role.roleValue;
|
|
279
|
+
})
|
|
280
|
+
.filter((a) => !!a) || []);
|
|
281
|
+
this.aclService.attachAbility(abilities);
|
|
282
|
+
this.menuService.add([currentMenu]);
|
|
283
|
+
setCurrent({
|
|
284
|
+
name: currentMenu.text,
|
|
285
|
+
intro: currentMenu.intro || '',
|
|
286
|
+
icon: currentMenu.appIconUrl || './assets/tmp/img/avatar.jpg'
|
|
287
|
+
});
|
|
288
|
+
const attributes = currentMenu.attribute;
|
|
289
|
+
if (attributes) {
|
|
290
|
+
const attr = JSON.parse(attributes);
|
|
291
|
+
if (attr && attr.defaultRoute) {
|
|
292
|
+
setDefaultRoute(attr.defaultRoute);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
setDefaultRoute('/displayIndex');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
setDefaultRoute('/displayIndex');
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return of(void 0);
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
token() {
|
|
306
|
+
if (this.config.loginForm) {
|
|
307
|
+
return this.httpClient.post(`/auth/oauth/token?_allow_anonymous=true`, this.config.loginForm).pipe(map((response) => {
|
|
308
|
+
return response;
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
const uri = encodeURIComponent(this.win.location.href);
|
|
313
|
+
return this.httpClient
|
|
314
|
+
.get(`/cas-proxy/app/validate_full?callback=${uri}&_allow_anonymous=true×tamp=${new Date().getTime()}`)
|
|
315
|
+
.pipe(map((response) => {
|
|
316
|
+
switch (response.errcode) {
|
|
317
|
+
case 2000:
|
|
318
|
+
return response.data;
|
|
319
|
+
case 2001:
|
|
320
|
+
this.win.location.href = response.msg;
|
|
321
|
+
throw Error("Cookie Error: Can't find Cas Cookie,So jump to login!");
|
|
322
|
+
default:
|
|
323
|
+
if (response.data) {
|
|
324
|
+
console.error(response.data);
|
|
325
|
+
throw Error(response.data);
|
|
326
|
+
}
|
|
327
|
+
else if (response.msg) {
|
|
328
|
+
console.error(response.msg);
|
|
329
|
+
throw Error(response.msg);
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
console.error('cas unknown error');
|
|
333
|
+
throw Error('Unknown Error: Cas auth exception!');
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiStartupService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
340
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiStartupService }); }
|
|
341
|
+
}
|
|
342
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiStartupService, decorators: [{
|
|
343
|
+
type: Injectable
|
|
344
|
+
}] });
|
|
345
|
+
function mapYzSideToYelonMenu(menus) {
|
|
346
|
+
menus.forEach(menu => {
|
|
347
|
+
if (menu.children && menu.hideChildren) {
|
|
348
|
+
menu.children.forEach(c => (c.hide = true));
|
|
349
|
+
}
|
|
350
|
+
menu.badgeDot = menu.badge_dot || null;
|
|
351
|
+
menu.badgeStatus = menu.badge_status || null;
|
|
352
|
+
menu.shortcutRoot = menu.shortcut_root || null;
|
|
353
|
+
menu.reuse = true;
|
|
354
|
+
if (menu.children) {
|
|
355
|
+
mapYzSideToYelonMenu(menu.children);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
function generateAbility(menus, abilities, prefix) {
|
|
360
|
+
menus.forEach(menu => {
|
|
361
|
+
if (menu.link) {
|
|
362
|
+
prefix += menu.link;
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
prefix += '';
|
|
366
|
+
}
|
|
367
|
+
if (menu.menuAuths) {
|
|
368
|
+
menu.menuAuths.forEach((a) => {
|
|
369
|
+
abilities.push(`${prefix}:${a}`);
|
|
370
|
+
abilities.push(a);
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
if (menu.children) {
|
|
374
|
+
generateAbility(menu.children, abilities, prefix);
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
class YunzaiAnalysisAddonGuardService {
|
|
380
|
+
constructor(configService, pathToRegexp, win, tokenService) {
|
|
381
|
+
this.configService = configService;
|
|
382
|
+
this.pathToRegexp = pathToRegexp;
|
|
383
|
+
this.win = win;
|
|
384
|
+
this.tokenService = tokenService;
|
|
385
|
+
this.bis = BUSINESS_DEFAULT_CONFIG;
|
|
386
|
+
this.menus = [];
|
|
387
|
+
this.links = [];
|
|
388
|
+
this.value = {};
|
|
389
|
+
this.bis = mergeBisConfig(this.configService);
|
|
390
|
+
const [, getUser] = useLocalStorageUser();
|
|
391
|
+
const user = getUser();
|
|
392
|
+
this.menus = deepCopy(user.menu || []).filter((m) => m.systemCode && m.systemCode === this.bis.systemCode);
|
|
393
|
+
if (user) {
|
|
394
|
+
this.value = {
|
|
395
|
+
systemCode: this.bis.systemCode,
|
|
396
|
+
userid: user.id,
|
|
397
|
+
realname: user.realname,
|
|
398
|
+
usertype: user.userType,
|
|
399
|
+
usercode: user.userCode,
|
|
400
|
+
username: user.username,
|
|
401
|
+
account: user.username,
|
|
402
|
+
deptid: user.deptId,
|
|
403
|
+
deptname: user.deptName,
|
|
404
|
+
token: this.tokenService.get()?.access_token
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
if (this.menus && this.menus.length > 0) {
|
|
408
|
+
this.value['system'] = this.menus[0].text;
|
|
409
|
+
}
|
|
410
|
+
this.getAllLinks(this.menus, this.links);
|
|
411
|
+
}
|
|
412
|
+
process(url) {
|
|
413
|
+
let flag = false;
|
|
414
|
+
this.links.forEach(link => {
|
|
415
|
+
if (link.link === url.split('?')[0]) {
|
|
416
|
+
flag = true;
|
|
417
|
+
this.value['routename'] = link.title;
|
|
418
|
+
this.value['routeurl'] = link.link;
|
|
419
|
+
if (this.win['yunzai']) {
|
|
420
|
+
this.win['yunzai'].setExtra(this.value);
|
|
421
|
+
}
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
const regexp = this.pathToRegexp.stringToRegexp(link, null, null);
|
|
425
|
+
if (regexp.test(url.split('?')[0])) {
|
|
426
|
+
flag = true;
|
|
427
|
+
this.value['routename'] = link.title;
|
|
428
|
+
this.value['routeurl'] = link.link;
|
|
429
|
+
if (this.win['yunzai']) {
|
|
430
|
+
this.win['yunzai'].setExtra(this.value);
|
|
431
|
+
}
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
if (!flag) {
|
|
436
|
+
this.value['routename'] = url;
|
|
437
|
+
this.value['routeurl'] = url;
|
|
438
|
+
if (this.win['yunzai']) {
|
|
439
|
+
this.win['yunzai'].setExtra(this.value);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return true;
|
|
443
|
+
}
|
|
444
|
+
getAllLinks(menu, links) {
|
|
445
|
+
menu.forEach((sider) => {
|
|
446
|
+
if (sider.link) {
|
|
447
|
+
links.push({ title: sider.text ? sider.text : sider.link, link: sider.link });
|
|
448
|
+
}
|
|
449
|
+
if (sider.children && sider.children.length > 0) {
|
|
450
|
+
this.getAllLinks(sider.children, links);
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiAnalysisAddonGuardService, deps: [{ token: i1.YunzaiConfigService }, { token: i1.PathToRegexpService }, { token: WINDOW }, { token: YA_SERVICE_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
455
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiAnalysisAddonGuardService, providedIn: 'root' }); }
|
|
456
|
+
}
|
|
457
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiAnalysisAddonGuardService, decorators: [{
|
|
458
|
+
type: Injectable,
|
|
459
|
+
args: [{
|
|
460
|
+
providedIn: 'root'
|
|
461
|
+
}]
|
|
462
|
+
}], ctorParameters: () => [{ type: i1.YunzaiConfigService }, { type: i1.PathToRegexpService }, { type: undefined, decorators: [{
|
|
463
|
+
type: Inject,
|
|
464
|
+
args: [WINDOW]
|
|
465
|
+
}] }, { type: undefined, decorators: [{
|
|
466
|
+
type: Inject,
|
|
467
|
+
args: [YA_SERVICE_TOKEN]
|
|
468
|
+
}] }] });
|
|
469
|
+
const analysisAddonCanActive = (_, state) => inject(YunzaiAnalysisAddonGuardService).process(state.url);
|
|
470
|
+
const analysisAddonCanActiveChild = (_, state) => inject(YunzaiAnalysisAddonGuardService).process(state.url);
|
|
471
|
+
|
|
472
|
+
class ActGuardService {
|
|
473
|
+
constructor(configService, pathToRegexp, router) {
|
|
474
|
+
this.configService = configService;
|
|
475
|
+
this.pathToRegexp = pathToRegexp;
|
|
476
|
+
this.router = router;
|
|
477
|
+
this.bis = BUSINESS_DEFAULT_CONFIG;
|
|
478
|
+
this.menus = [];
|
|
479
|
+
this.links = [];
|
|
480
|
+
log('act: ');
|
|
481
|
+
this.bis = mergeBisConfig(this.configService);
|
|
482
|
+
log('act: config ', this.bis);
|
|
483
|
+
const [, getUser] = useLocalStorageUser();
|
|
484
|
+
const user = getUser();
|
|
485
|
+
log('act: user ', user);
|
|
486
|
+
// @ts-ignore
|
|
487
|
+
this.menus = deepCopy(user.menu || []).filter((m) => m.systemCode && m.systemCode === this.bis.systemCode);
|
|
488
|
+
log('act: menus ', this.menus);
|
|
489
|
+
this.getAllLinks(this.menus, this.links);
|
|
490
|
+
log('act: links ', this.links);
|
|
491
|
+
}
|
|
492
|
+
process(url) {
|
|
493
|
+
log('act: can activate ', url);
|
|
494
|
+
if (this.preHandle(url)) {
|
|
495
|
+
return true;
|
|
496
|
+
}
|
|
497
|
+
log('act: can activate child prehandle success');
|
|
498
|
+
let canactivate = false;
|
|
499
|
+
this.links.forEach((link) => {
|
|
500
|
+
// path = /xxx
|
|
501
|
+
if (link === url.split('?')[0]) {
|
|
502
|
+
canactivate = true;
|
|
503
|
+
log(`act: link value ${link} equals url value ${url}`);
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
// paht = /xxx/:xx
|
|
507
|
+
const regexp = this.pathToRegexp.stringToRegexp(link, null, null);
|
|
508
|
+
log(`act: ${link} test ${url.split('?')[0]}`);
|
|
509
|
+
if (regexp.test(url.split('?')[0])) {
|
|
510
|
+
canactivate = true;
|
|
511
|
+
log(`act: test value ${canactivate}`);
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
if (canactivate) {
|
|
516
|
+
log(`act: test sucess`);
|
|
517
|
+
return true;
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
log(`act: test error`);
|
|
521
|
+
this.router.navigate(['displayIndex']);
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
preHandle(url) {
|
|
526
|
+
return (url.includes('error') ||
|
|
527
|
+
url.includes('exception') ||
|
|
528
|
+
url.includes('displayIndex') ||
|
|
529
|
+
url === '' ||
|
|
530
|
+
url === null ||
|
|
531
|
+
url === '/' ||
|
|
532
|
+
url.includes('iframePage'));
|
|
533
|
+
}
|
|
534
|
+
getAllLinks(menu, links) {
|
|
535
|
+
menu.forEach((sider) => {
|
|
536
|
+
if (sider.link) {
|
|
537
|
+
links.push(sider.link);
|
|
538
|
+
}
|
|
539
|
+
if (sider.children && sider.children.length > 0) {
|
|
540
|
+
this.getAllLinks(sider.children, links);
|
|
541
|
+
}
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: ActGuardService, deps: [{ token: i1.YunzaiConfigService }, { token: i1.PathToRegexpService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
545
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: ActGuardService, providedIn: 'root' }); }
|
|
546
|
+
}
|
|
547
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: ActGuardService, decorators: [{
|
|
548
|
+
type: Injectable,
|
|
549
|
+
args: [{ providedIn: 'root' }]
|
|
550
|
+
}], ctorParameters: () => [{ type: i1.YunzaiConfigService }, { type: i1.PathToRegexpService }, { type: i2.Router }] });
|
|
551
|
+
const actGuardCanActive = (_, state) => inject(ActGuardService).process(state.url);
|
|
552
|
+
const actGuardCanActiveChild = (_, state) => inject(ActGuardService).process(state.url);
|
|
2
553
|
|
|
3
554
|
/**
|
|
4
555
|
* Generated bundle index. Do not edit.
|
|
5
556
|
*/
|
|
557
|
+
|
|
558
|
+
export { ActGuardService, BisModule, CODEMESSAGE, YunzaiAnalysisAddonGuardService, YunzaiStartupService, actGuardCanActive, actGuardCanActiveChild, analysisAddonCanActive, analysisAddonCanActiveChild, checkStatus, generateAbility, getAdditionalHeaders, goTo, mapYzSideToYelonMenu, provideYunzaiBindAuthRefresh, provideYunzaiBis, provideYunzaiStartup, toLogin, tryRefreshToken, yunzaiDefaultInterceptor };
|
|
6
559
|
//# sourceMappingURL=bis.mjs.map
|
package/fesm2022/bis.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bis.mjs","sources":["../../../../packages/bis/public_api.ts","../../../../packages/bis/bis.ts"],"sourcesContent":["export default void 0;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA,iBAAe,KAAK,CAAC;;ACArB;;AAEG"}
|
|
1
|
+
{"version":3,"file":"bis.mjs","sources":["../../../../packages/bis/src/bis.module.ts","../../../../packages/bis/src/provide.ts","../../../../packages/bis/src/helper.ts","../../../../packages/bis/src/refresh-token.ts","../../../../packages/bis/src/yunzai-default.interceptor.ts","../../../../packages/bis/src/startup.service.ts","../../../../packages/bis/src/yunzai-analysis-addon.guard.ts","../../../../packages/bis/src/yunzai-act.guard.ts","../../../../packages/bis/bis.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\n\nimport { YunzaiLayoutModule } from '@yelon/bis/layout';\nimport { YunzaiWidgetsModule } from '@yelon/bis/yunzai-widgets';\n@NgModule({\n imports: [YunzaiLayoutModule, YunzaiWidgetsModule],\n exports: [YunzaiLayoutModule, YunzaiWidgetsModule]\n})\nexport class BisModule {}\n","import { EnvironmentProviders, importProvidersFrom, makeEnvironmentProviders } from '@angular/core';\n\nimport { BisModule } from './bis.module';\n\nexport function provideYunzaiBis(): EnvironmentProviders {\n const provides: EnvironmentProviders[] = [];\n provides.push(importProvidersFrom(BisModule));\n return makeEnvironmentProviders(provides);\n}\n","import { HttpHeaders, HttpResponseBase } from '@angular/common/http';\nimport { inject, Injector } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { YA_SERVICE_TOKEN } from '@yelon/auth';\nimport { YUNZAI_I18N_TOKEN } from '@yelon/theme';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\nimport { NzNotificationService } from 'ng-zorro-antd/notification';\n\nexport const CODEMESSAGE: { [key: number]: string } = {\n 200: '服务器成功返回请求的数据。',\n 201: '新建或修改数据成功。',\n 202: '一个请求已经进入后台排队(异步任务)。',\n 204: '删除数据成功。',\n 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',\n 401: '用户没有权限(令牌、用户名、密码错误)。',\n 403: '用户得到授权,但是访问是被禁止的。',\n 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',\n 406: '请求的格式不可得。',\n 410: '请求的资源被永久删除,且不会再得到的。',\n 422: '当创建一个对象时,发生一个验证错误。',\n 500: '服务器发生错误,请检查服务器。',\n 502: '网关错误。',\n 503: '服务不可用,服务器暂时过载或维护。',\n 504: '网关超时。'\n};\n\nexport function getAdditionalHeaders(headers?: HttpHeaders): { [name: string]: string } {\n const res: { [name: string]: string } = {};\n const lang = inject(YUNZAI_I18N_TOKEN).currentLang;\n if (!headers?.has('Accept-Language') && lang) {\n res['Accept-Language'] = lang;\n }\n\n return res;\n}\n\nexport function checkStatus(injector: Injector, ev: HttpResponseBase): void {\n if ((ev.status >= 200 && ev.status < 300) || ev.status === 401) {\n return;\n }\n const errortext = CODEMESSAGE[ev.status] || ev.statusText;\n injector.get(NzNotificationService).error(`请求错误 ${ev.status}: ${ev.url}`, errortext);\n}\n\nexport interface ReThrowHttpError {\n body: NzSafeAny;\n _throw: true;\n}\n\nexport function goTo(injector: Injector, url: string): void {\n setTimeout(() => injector.get(Router).navigateByUrl(url));\n}\n\nexport function toLogin(injector: Injector): void {\n injector.get(NzNotificationService).error(`未登录或登录已过期,请重新登录。`, ``);\n goTo(injector, injector.get(YA_SERVICE_TOKEN).login_url!);\n}\n","import { HttpClient, HttpHandlerFn, HttpRequest, HttpResponseBase } from '@angular/common/http';\nimport { APP_INITIALIZER, Injector, Provider } from '@angular/core';\nimport { BehaviorSubject, catchError, filter, Observable, switchMap, take, throwError } from 'rxjs';\n\nimport { YA_SERVICE_TOKEN } from '@yelon/auth';\nimport { log } from '@yelon/util';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\nimport { toLogin } from './helper';\n\nlet refreshToking = false;\nlet refreshToken$: BehaviorSubject<NzSafeAny> = new BehaviorSubject<NzSafeAny>(null);\n\nexport const tryRefreshToken = (\n injector: Injector,\n ev: HttpResponseBase,\n req: HttpRequest<NzSafeAny>,\n next: HttpHandlerFn\n): Observable<NzSafeAny> => {\n // 连刷新Token的请求都错了,那就是真错了\n if (['/auth/oauth/getOrCreateToken/webapp'].some(url => req.url.includes(url))) {\n toLogin(injector);\n return throwError(() => ev);\n }\n // 2、如果 `refreshToking` 为 `true` 表示已经在请求刷新 Token 中,后续所有请求转入等待状态,直至结果返回后再重新发起请求\n if (refreshToking) {\n return refreshToken$.pipe(\n filter(v => !!v),\n take(1),\n switchMap(() => next(reAttachToken(injector, req)))\n );\n }\n // 3、尝试调用刷新 Token\n refreshToking = true;\n refreshToken$.next(null);\n\n return refreshTokenRequest(injector).pipe(\n switchMap(res => {\n // 通知后续请求继续执行\n refreshToking = false;\n refreshToken$.next(res);\n // 重新保存新 token\n injector.get(YA_SERVICE_TOKEN).set(res);\n // 重新发起请求\n return next(reAttachToken(injector, req));\n }),\n catchError(err => {\n refreshToking = false;\n toLogin(injector);\n return throwError(() => err);\n })\n );\n};\n\nfunction reAttachToken(injector: Injector, req: HttpRequest<NzSafeAny>): HttpRequest<NzSafeAny> {\n const token = injector.get(YA_SERVICE_TOKEN).get()?.access_token;\n return req.clone({\n setHeaders: {\n Authorization: `Bearer ${token}`\n }\n });\n}\n\nfunction refreshTokenRequest(injector: Injector): Observable<NzSafeAny> {\n const model = injector.get(YA_SERVICE_TOKEN).get();\n const form = new FormData();\n form.set('refresh_token', model?.refresh_token!);\n form.set('grant_type', 'refresh_token');\n form.set('scope', 'webapp');\n return injector.get(HttpClient).post(`/auth/oauth/getOrCreateToken/webapp`, form);\n}\n\nfunction buildAuthRefresh(injector: Injector): void {\n const tokenSrv = injector.get(YA_SERVICE_TOKEN);\n tokenSrv.refresh\n .pipe(\n filter(() => !refreshToking),\n switchMap(res => {\n log(res);\n refreshToking = true;\n return refreshTokenRequest(injector);\n })\n )\n .subscribe({\n next: res => {\n res.expired = +new Date() + 1000 * 60 * 5;\n refreshToking = false;\n tokenSrv.set(res);\n },\n error: () => toLogin(injector)\n });\n}\n\nexport function provideYunzaiBindAuthRefresh(): Provider[] {\n return [\n {\n provide: APP_INITIALIZER,\n useFactory: (injector: Injector) => () => buildAuthRefresh(injector),\n deps: [Injector],\n multi: true\n }\n ];\n}\n","import {\n HttpErrorResponse,\n HttpHandlerFn,\n HttpInterceptorFn,\n HttpRequest,\n HttpResponseBase\n} from '@angular/common/http';\nimport { Injector, inject } from '@angular/core';\nimport { Observable, of, throwError, mergeMap, catchError } from 'rxjs';\n\nimport { mergeBisConfig } from '@yelon/bis/config';\nimport { IGNORE_BASE_URL } from '@yelon/theme';\nimport { YUNZAI_CONFIG, YunzaiConfigService } from '@yelon/util';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\nimport { checkStatus, getAdditionalHeaders, goTo, ReThrowHttpError, toLogin } from './helper';\nimport { tryRefreshToken } from './refresh-token';\n\nfunction handleData(\n injector: Injector,\n ev: HttpResponseBase,\n req: HttpRequest<NzSafeAny>,\n next: HttpHandlerFn\n): Observable<NzSafeAny> {\n checkStatus(injector, ev);\n const config = injector.get(YUNZAI_CONFIG).bis!;\n switch (ev.status) {\n case 200:\n return of(ev);\n case 401:\n if (config.refreshTokenEnabled && config.refreshTokenType === 're-request') {\n const unAuthorizationReq = req.clone();\n unAuthorizationReq.headers.delete('Authorization');\n return tryRefreshToken(injector, ev, unAuthorizationReq, next);\n }\n toLogin(injector);\n break;\n case 403:\n case 404:\n case 500:\n goTo(injector, `/exception/${ev.status}?url=${req.urlWithParams}`);\n break;\n default:\n if (ev instanceof HttpErrorResponse) {\n console.warn(\n '未可知错误,大部分是由于后端不支持跨域CORS或无效配置引起,请参考 https://ng.yunzainfo.com/docs/server 解决跨域问题',\n ev\n );\n }\n break;\n }\n if (ev instanceof HttpErrorResponse) {\n return throwError(() => ev);\n } else if ((ev as unknown as ReThrowHttpError)._throw) {\n return throwError(() => (ev as unknown as ReThrowHttpError).body);\n } else {\n return of(ev);\n }\n}\n\nexport const yunzaiDefaultInterceptor: HttpInterceptorFn = (req, next) => {\n const config = mergeBisConfig(inject(YunzaiConfigService));\n const { baseUrl } = config;\n let url = req.url;\n if (!req.context.get(IGNORE_BASE_URL) && !url.startsWith('https://') && !url.startsWith('http://')) {\n url = baseUrl + (baseUrl!.endsWith('/') && url.startsWith('/') ? url.substring(1) : url);\n }\n if (url.includes('.json') && url.includes('assets')) {\n url = req.url;\n }\n const newReq = req.clone({ url, setHeaders: getAdditionalHeaders(req.headers) });\n const injector = inject(Injector);\n return next(newReq).pipe(\n mergeMap(ev => {\n if (ev instanceof HttpResponseBase) {\n return handleData(injector, ev, newReq, next);\n }\n return of(ev);\n }),\n catchError((err: HttpErrorResponse) => handleData(injector, err, newReq, next))\n );\n};\n","import { HttpClient } from '@angular/common/http';\nimport { APP_INITIALIZER, inject, Injectable, Provider } from '@angular/core';\nimport { combineLatest, map, mergeMap, Observable, of } from 'rxjs';\n\nimport { ACLService } from '@yelon/acl';\nimport { ITokenModel, YA_SERVICE_TOKEN } from '@yelon/auth';\nimport { mergeBisConfig } from '@yelon/bis/config';\nimport {\n Menu,\n MenuService,\n SettingsService,\n TitleService,\n YUNZAI_I18N_TOKEN,\n YunzaiHttpI18NService\n} from '@yelon/theme';\nimport {\n deepCopy,\n useLocalStorageCurrent,\n useLocalStorageDefaultRoute,\n useLocalStorageHeader,\n useLocalStorageProjectInfo,\n useLocalStorageTenant,\n useLocalStorageUser,\n WINDOW,\n YunzaiConfigService,\n YunzaiMenu,\n YunzaiMenuAttribute\n} from '@yelon/util';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\nexport function provideYunzaiStartup(): Provider[] {\n return [\n YunzaiStartupService,\n {\n provide: APP_INITIALIZER,\n useFactory: (startupService: YunzaiStartupService) => () => startupService.load(),\n deps: [YunzaiStartupService],\n multi: true\n }\n ];\n}\n@Injectable()\nexport class YunzaiStartupService {\n private readonly config = mergeBisConfig(inject(YunzaiConfigService));\n private readonly menuService = inject(MenuService);\n private readonly aclService = inject(ACLService);\n private readonly titleService = inject(TitleService);\n private readonly tokenService = inject(YA_SERVICE_TOKEN);\n private readonly httpClient = inject(HttpClient);\n private readonly settingService = inject(SettingsService);\n private readonly i18n = inject<YunzaiHttpI18NService>(YUNZAI_I18N_TOKEN);\n private readonly win = inject(WINDOW);\n private readonly configService = inject(YunzaiConfigService);\n\n load(): Observable<void> {\n let defaultLang: string = this.settingService.layout.lang || this.i18n.defaultLang;\n const [setTenant] = useLocalStorageTenant();\n const [setUser, getUser] = useLocalStorageUser();\n const [setHeader] = useLocalStorageHeader();\n const [setProject] = useLocalStorageProjectInfo();\n const [setDefaultRoute] = useLocalStorageDefaultRoute();\n const [setCurrent] = useLocalStorageCurrent();\n return this.token().pipe(\n mergeMap((token: ITokenModel) => {\n this.configService.set('auth', {\n token_send_key: 'Authorization',\n token_send_template: `${token.token_type} \\${access_token}`,\n token_send_place: 'header'\n });\n this.tokenService.set(token);\n return of(void 0);\n }),\n mergeMap(() => {\n return combineLatest([\n this.httpClient.get(`/auth/user`),\n this.httpClient.get(`/auth/allheader/v2`),\n this.httpClient.get(`/app-manager/project/info`)\n ]).pipe(\n map(([user, header, project]: NzSafeAny) => {\n setUser(user.principal);\n setTenant(user.tenantId);\n setHeader(header.data);\n setProject(project.data);\n return void 0;\n })\n );\n }),\n mergeMap(() => {\n return this.i18n.loadLangData(defaultLang).pipe(\n map((langData: NzSafeAny) => {\n this.i18n.use(defaultLang, langData);\n return void 0;\n })\n );\n }),\n mergeMap(() => {\n const yunzaiUser = getUser()!;\n const yunzaiMenus: YunzaiMenu[] = deepCopy(yunzaiUser.menu).filter(\n m => m.systemCode && m.systemCode === this.config.systemCode\n );\n const currentMenu = yunzaiMenus.pop();\n if (currentMenu) {\n this.settingService.setApp({ name: currentMenu.text, description: currentMenu.intro });\n this.settingService.setUser({\n name: yunzaiUser.realname,\n avatar: `${this.config.baseUrl}/filecenter/file/${yunzaiUser.avatarId}` || '',\n email: yunzaiUser.email\n });\n this.titleService.default = currentMenu && currentMenu.text ? currentMenu.text : 'default application name';\n this.titleService.setTitle(currentMenu && currentMenu.text ? currentMenu.text : 'no title');\n const abilities: string[] = [];\n generateAbility([currentMenu], abilities, '');\n this.aclService.attachRole(\n yunzaiUser?.roles\n .map((role: NzSafeAny) => {\n return role.roleValue;\n })\n .filter((a: NzSafeAny) => !!a) || []\n );\n this.aclService.attachAbility(abilities);\n this.menuService.add([currentMenu as Menu]);\n setCurrent({\n name: currentMenu.text,\n intro: currentMenu.intro || '',\n icon: currentMenu.appIconUrl || './assets/tmp/img/avatar.jpg'\n });\n const attributes = currentMenu.attribute;\n if (attributes) {\n const attr: YunzaiMenuAttribute = JSON.parse(attributes);\n if (attr && attr.defaultRoute) {\n setDefaultRoute(attr.defaultRoute);\n } else {\n setDefaultRoute('/displayIndex');\n }\n } else {\n setDefaultRoute('/displayIndex');\n }\n }\n return of(void 0);\n })\n );\n }\n\n token(): Observable<ITokenModel> {\n if (this.config.loginForm) {\n return this.httpClient.post(`/auth/oauth/token?_allow_anonymous=true`, this.config.loginForm).pipe(\n map((response: NzSafeAny) => {\n return response;\n })\n );\n } else {\n const uri = encodeURIComponent(this.win.location.href);\n return this.httpClient\n .get(`/cas-proxy/app/validate_full?callback=${uri}&_allow_anonymous=true×tamp=${new Date().getTime()}`)\n .pipe(\n map((response: NzSafeAny) => {\n switch (response.errcode) {\n case 2000:\n return response.data;\n case 2001:\n this.win.location.href = response.msg;\n throw Error(\"Cookie Error: Can't find Cas Cookie,So jump to login!\");\n default:\n if (response.data) {\n console.error(response.data);\n throw Error(response.data);\n } else if (response.msg) {\n console.error(response.msg);\n throw Error(response.msg);\n } else {\n console.error('cas unknown error');\n throw Error('Unknown Error: Cas auth exception!');\n }\n }\n })\n );\n }\n }\n}\n\nexport function mapYzSideToYelonMenu(menus: YunzaiMenu[]): void {\n menus.forEach(menu => {\n if (menu.children && menu.hideChildren) {\n menu.children.forEach(c => (c.hide = true));\n }\n menu.badgeDot = menu.badge_dot || null;\n menu.badgeStatus = menu.badge_status || null;\n menu.shortcutRoot = menu.shortcut_root || null;\n menu.reuse = true;\n if (menu.children) {\n mapYzSideToYelonMenu(menu.children);\n }\n });\n}\n\nexport function generateAbility(menus: YunzaiMenu[], abilities: string[], prefix: string): void {\n menus.forEach(menu => {\n if (menu.link) {\n prefix += menu.link;\n } else {\n prefix += '';\n }\n if (menu.menuAuths) {\n menu.menuAuths.forEach((a: string) => {\n abilities.push(`${prefix}:${a}`);\n abilities.push(a);\n });\n }\n\n if (menu.children) {\n generateAbility(menu.children, abilities, prefix);\n }\n });\n}\n","import { Inject, inject, Injectable } from '@angular/core';\nimport { CanActivateChildFn, CanActivateFn } from '@angular/router';\n\nimport { ITokenService, YA_SERVICE_TOKEN } from '@yelon/auth';\nimport { BUSINESS_DEFAULT_CONFIG, mergeBisConfig } from '@yelon/bis/config';\nimport { Menu } from '@yelon/theme';\nimport {\n deepCopy,\n PathToRegexpService,\n useLocalStorageUser,\n WINDOW,\n YunzaiBusinessConfig,\n YunzaiConfigService,\n YunzaiUser\n} from '@yelon/util';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class YunzaiAnalysisAddonGuardService {\n private bis: YunzaiBusinessConfig = BUSINESS_DEFAULT_CONFIG;\n private menus: NzSafeAny[] = [];\n private links: Array<{ title: string; link: string }> = [];\n private value: NzSafeAny = {};\n\n constructor(\n private configService: YunzaiConfigService,\n private pathToRegexp: PathToRegexpService,\n @Inject(WINDOW) private win: NzSafeAny,\n @Inject(YA_SERVICE_TOKEN) private tokenService: ITokenService\n ) {\n this.bis = mergeBisConfig(this.configService);\n const [, getUser] = useLocalStorageUser();\n const user: YunzaiUser = getUser()!;\n this.menus = deepCopy((user.menu as NzSafeAny) || []).filter(\n (m: Menu) => m.systemCode && m.systemCode === this.bis.systemCode\n ) as Menu[];\n if (user) {\n this.value = {\n systemCode: this.bis.systemCode,\n userid: user.id,\n realname: user.realname,\n usertype: user.userType,\n usercode: user.userCode,\n username: user.username,\n account: user.username,\n deptid: user.deptId,\n deptname: user.deptName,\n token: this.tokenService.get()?.access_token\n };\n }\n if (this.menus && this.menus.length > 0) {\n this.value['system'] = (this.menus[0] as Menu).text;\n }\n this.getAllLinks(this.menus, this.links);\n }\n\n process(url: string): boolean {\n let flag = false;\n this.links.forEach(link => {\n if (link.link === url.split('?')[0]) {\n flag = true;\n this.value['routename'] = link.title;\n this.value['routeurl'] = link.link;\n if (this.win['yunzai']) {\n this.win['yunzai'].setExtra(this.value);\n }\n return;\n }\n const regexp: RegExp = this.pathToRegexp.stringToRegexp(link, null, null);\n if (regexp.test(url.split('?')[0])) {\n flag = true;\n this.value['routename'] = link.title;\n this.value['routeurl'] = link.link;\n if (this.win['yunzai']) {\n this.win['yunzai'].setExtra(this.value);\n }\n return;\n }\n });\n if (!flag) {\n this.value['routename'] = url;\n this.value['routeurl'] = url;\n if (this.win['yunzai']) {\n this.win['yunzai'].setExtra(this.value);\n }\n }\n return true;\n }\n\n getAllLinks(menu: Menu[], links: Array<{ title: string; link: string }>): void {\n menu.forEach((sider: Menu) => {\n if (sider.link) {\n links.push({ title: sider.text ? sider.text : sider.link, link: sider.link });\n }\n if (sider.children && sider.children.length > 0) {\n this.getAllLinks(sider.children, links);\n }\n });\n }\n}\n\nexport const analysisAddonCanActive: CanActivateFn = (_, state) =>\n inject(YunzaiAnalysisAddonGuardService).process(state.url);\nexport const analysisAddonCanActiveChild: CanActivateChildFn = (_, state) =>\n inject(YunzaiAnalysisAddonGuardService).process(state.url);\n","import { Injectable, inject } from '@angular/core';\nimport { CanActivateChildFn, CanActivateFn, Router } from '@angular/router';\n\nimport { BUSINESS_DEFAULT_CONFIG, mergeBisConfig } from '@yelon/bis/config';\nimport { Menu } from '@yelon/theme';\nimport {\n deepCopy,\n log,\n YunzaiBusinessConfig,\n YunzaiConfigService,\n PathToRegexpService,\n useLocalStorageUser,\n YunzaiUser\n} from '@yelon/util';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\n@Injectable({ providedIn: 'root' })\nexport class ActGuardService {\n private bis: YunzaiBusinessConfig = BUSINESS_DEFAULT_CONFIG;\n private menus: NzSafeAny[] = [];\n private links: string[] = [];\n\n constructor(\n private configService: YunzaiConfigService,\n private pathToRegexp: PathToRegexpService,\n private router: Router\n ) {\n log('act: ');\n this.bis = mergeBisConfig(this.configService);\n log('act: config ', this.bis);\n const [, getUser] = useLocalStorageUser();\n const user: YunzaiUser = getUser()!;\n log('act: user ', user);\n // @ts-ignore\n this.menus = deepCopy((user.menu as NzSafeAny) || []).filter(\n (m: Menu) => m.systemCode && m.systemCode === this.bis.systemCode\n ) as Menu[];\n log('act: menus ', this.menus);\n this.getAllLinks(this.menus, this.links);\n log('act: links ', this.links);\n }\n\n process(url: string): boolean {\n log('act: can activate ', url);\n if (this.preHandle(url)) {\n return true;\n }\n log('act: can activate child prehandle success');\n let canactivate = false;\n this.links.forEach((link: string) => {\n // path = /xxx\n if (link === url.split('?')[0]) {\n canactivate = true;\n log(`act: link value ${link} equals url value ${url}`);\n return;\n }\n // paht = /xxx/:xx\n const regexp: RegExp = this.pathToRegexp.stringToRegexp(link, null, null);\n log(`act: ${link} test ${url.split('?')[0]}`);\n if (regexp.test(url.split('?')[0])) {\n canactivate = true;\n log(`act: test value ${canactivate}`);\n return;\n }\n });\n if (canactivate) {\n log(`act: test sucess`);\n return true;\n } else {\n log(`act: test error`);\n this.router.navigate(['displayIndex']);\n return false;\n }\n }\n\n preHandle(url: string): boolean {\n return (\n url.includes('error') ||\n url.includes('exception') ||\n url.includes('displayIndex') ||\n url === '' ||\n url === null ||\n url === '/' ||\n url.includes('iframePage')\n );\n }\n\n getAllLinks(menu: Menu[], links: string[]): void {\n menu.forEach((sider: Menu) => {\n if (sider.link) {\n links.push(sider.link);\n }\n if (sider.children && sider.children.length > 0) {\n this.getAllLinks(sider.children, links);\n }\n });\n }\n}\n\nexport const actGuardCanActive: CanActivateFn = (_, state) => inject(ActGuardService).process(state.url);\nexport const actGuardCanActiveChild: CanActivateChildFn = (_, state) => inject(ActGuardService).process(state.url);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|