@reskin/core 0.0.21 → 0.1.0
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/bundles/reskin-core-directives.umd.js +303 -163
- package/bundles/reskin-core-directives.umd.js.map +1 -1
- package/bundles/reskin-core-guards.umd.js +119 -32
- package/bundles/reskin-core-guards.umd.js.map +1 -1
- package/bundles/reskin-core-interceptors.umd.js +310 -92
- package/bundles/reskin-core-interceptors.umd.js.map +1 -1
- package/bundles/reskin-core-utils.umd.js +220 -77
- package/bundles/reskin-core-utils.umd.js.map +1 -1
- package/directives/auth.directive.d.ts +56 -9
- package/directives/load.styles.directive.d.ts +45 -5
- package/directives/string.template.outlet.directive.d.ts +68 -11
- package/esm2015/directives/auth.directive.js +71 -30
- package/esm2015/directives/load.styles.directive.js +84 -15
- package/esm2015/directives/string.template.outlet.directive.js +118 -60
- package/esm2015/guards/auth.guard.js +117 -30
- package/esm2015/interceptors/blob.interceptor.js +67 -28
- package/esm2015/interceptors/cache.interceptor.js +46 -14
- package/esm2015/interceptors/error.interceptor.js +104 -12
- package/esm2015/interceptors/public-api.js +2 -1
- package/esm2015/interceptors/token.interceptor.js +86 -42
- package/esm2015/interceptors/types.js +5 -0
- package/esm2015/utils/array.js +42 -22
- package/esm2015/utils/dom.js +29 -11
- package/esm2015/utils/form.js +44 -13
- package/esm2015/utils/store.js +101 -26
- package/fesm2015/reskin-core-directives.js +269 -103
- package/fesm2015/reskin-core-directives.js.map +1 -1
- package/fesm2015/reskin-core-guards.js +116 -29
- package/fesm2015/reskin-core-guards.js.map +1 -1
- package/fesm2015/reskin-core-interceptors.js +302 -91
- package/fesm2015/reskin-core-interceptors.js.map +1 -1
- package/fesm2015/reskin-core-utils.js +212 -68
- package/fesm2015/reskin-core-utils.js.map +1 -1
- package/guards/auth.guard.d.ts +85 -5
- package/interceptors/blob.interceptor.d.ts +30 -3
- package/interceptors/cache.interceptor.d.ts +28 -4
- package/interceptors/error.interceptor.d.ts +43 -2
- package/interceptors/public-api.d.ts +1 -0
- package/interceptors/token.interceptor.d.ts +41 -12
- package/interceptors/types.d.ts +68 -0
- package/package.json +1 -1
- package/utils/array.d.ts +8 -1
- package/utils/dom.d.ts +32 -5
- package/utils/form.d.ts +37 -2
- package/utils/store.d.ts +56 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reskin-core-directives.js","sources":["../../../library/core/directives/auth.directive.ts","../../../library/core/directives/string.template.outlet.directive.ts","../../../library/core/directives/load.styles.directive.ts","../../../library/core/directives/directives.module.ts","../../../library/core/directives/reskin-core-directives.ts"],"sourcesContent":["import { Directive, Input, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { RkMenuService } from '@reskin/core/services';\r\n\r\n@Directive({\r\n selector: '[rkAuth]',\r\n})\r\nexport class RkAuthDirective implements OnDestroy {\r\n /**\r\n * 传递多个标识符时,逗号分隔,匹配按\"或者\"运算\r\n * @param condition\r\n */\r\n @Input()\r\n set rkAuth(condition: string | string[]) {\r\n this.condition = condition;\r\n this.updateView();\r\n }\r\n\r\n @Input()\r\n set rkAuthThen(templateRef: TemplateRef<any>) {\r\n this.thenTemplateRef = templateRef;\r\n this.updateView();\r\n }\r\n\r\n @Input()\r\n set rkAuthElse(templateRef: TemplateRef<any>) {\r\n this.elseTemplateRef = templateRef;\r\n this.updateView();\r\n }\r\n\r\n constructor(\r\n private menu: RkMenuService,\r\n private viewContainerRef: ViewContainerRef,\r\n public templateRef: TemplateRef<any>,\r\n ) {\r\n this.thenTemplateRef = templateRef;\r\n }\r\n\r\n private condition: string | string[] = '';\r\n private thenTemplateRef?: TemplateRef<any>;\r\n private elseTemplateRef?: TemplateRef<any>;\r\n private authSubscription?: Subscription;\r\n\r\n ngOnDestroy() {\r\n this.authSubscription?.unsubscribe();\r\n }\r\n\r\n private updateView() {\r\n this.authSubscription?.unsubscribe();\r\n this.authSubscription = this.hasAuth(this.condition).subscribe((context) => {\r\n this.viewContainerRef.clear();\r\n if (context.status) {\r\n if (this.thenTemplateRef) {\r\n this.viewContainerRef.createEmbeddedView(this.thenTemplateRef, context);\r\n }\r\n } else {\r\n if (this.elseTemplateRef) {\r\n this.viewContainerRef.createEmbeddedView(this.elseTemplateRef, context);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private hasAuth(tags: string | string[]) {\r\n const tagList: string[] = typeof tags === 'string' ? [tags] : tags;\r\n return this.menu.requestData().pipe(\r\n map((json) => {\r\n const menus = json.data.filter((menu) => tagList.includes(menu.SYSTEM_RESOURCE_GUARD_ID));\r\n if (!menus.length) return { $implicit: [], status: false };\r\n return {\r\n $implicit: typeof tags === 'string' ? menus[0] : menus,\r\n status: !!menus.length,\r\n };\r\n }),\r\n );\r\n }\r\n}\r\n","import { Directive, EmbeddedViewRef, Input, OnChanges, SimpleChange, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[rkStringTemplateOutlet]',\r\n})\r\nexport class RkStringTemplateOutletDirective<_T = unknown> implements OnChanges {\r\n private embeddedViewRef: EmbeddedViewRef<any> | null = null;\r\n private context = new RkStringTemplateOutletContext();\r\n @Input() rkStringTemplateOutletContext: any | null = null;\r\n @Input() rkStringTemplateOutlet: any | TemplateRef<any> = null;\r\n\r\n static rkTemplateContextGuard<T>(_dir: RkStringTemplateOutletDirective<T>, _ctx: any): _ctx is RkStringTemplateOutletContext {\r\n return true;\r\n }\r\n\r\n private recreateView(): void {\r\n this.viewContainer.clear();\r\n const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;\r\n const templateRef = (isTemplateRef ? this.rkStringTemplateOutlet : this.templateRef) as any;\r\n this.embeddedViewRef = this.viewContainer.createEmbeddedView(\r\n templateRef,\r\n isTemplateRef ? this.rkStringTemplateOutletContext : this.context,\r\n );\r\n }\r\n\r\n private updateContext(): void {\r\n const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;\r\n const newCtx = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;\r\n const oldCtx = this.embeddedViewRef!.context as any;\r\n if (newCtx) {\r\n for (const propName of Object.keys(newCtx)) {\r\n oldCtx[propName] = newCtx[propName];\r\n }\r\n }\r\n }\r\n\r\n constructor(\r\n private viewContainer: ViewContainerRef,\r\n private templateRef: TemplateRef<any>,\r\n ) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const { rkStringTemplateOutletContext, rkStringTemplateOutlet } = changes;\r\n const shouldRecreateView = (): boolean => {\r\n let shouldOutletRecreate = false;\r\n if (rkStringTemplateOutlet) {\r\n if (rkStringTemplateOutlet.firstChange) {\r\n shouldOutletRecreate = true;\r\n } else {\r\n const isPreviousOutletTemplate = rkStringTemplateOutlet.previousValue instanceof TemplateRef;\r\n const isCurrentOutletTemplate = rkStringTemplateOutlet.currentValue instanceof TemplateRef;\r\n shouldOutletRecreate = isPreviousOutletTemplate || isCurrentOutletTemplate;\r\n }\r\n }\r\n const hasContextShapeChanged = (ctxChange: SimpleChange): boolean => {\r\n const prevCtxKeys = Object.keys(ctxChange.previousValue || {});\r\n const currCtxKeys = Object.keys(ctxChange.currentValue || {});\r\n if (prevCtxKeys.length === currCtxKeys.length) {\r\n for (const propName of currCtxKeys) {\r\n if (prevCtxKeys.indexOf(propName) === -1) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n };\r\n const shouldContextRecreate = rkStringTemplateOutletContext && hasContextShapeChanged(rkStringTemplateOutletContext);\r\n return shouldContextRecreate || shouldOutletRecreate;\r\n };\r\n\r\n if (rkStringTemplateOutlet) {\r\n this.context.$implicit = rkStringTemplateOutlet.currentValue;\r\n }\r\n\r\n const recreateView = shouldRecreateView();\r\n if (recreateView) {\r\n /** recreate view when context shape or outlet change **/\r\n this.recreateView();\r\n } else {\r\n /** update context **/\r\n this.updateContext();\r\n }\r\n }\r\n}\r\n\r\nexport class RkStringTemplateOutletContext {\r\n public $implicit: any;\r\n}\r\n","import { Directive, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { ILoadResult, RkStyleLoaderService } from '@reskin/core/services';\r\n\r\n@Directive({\r\n selector: '[rkLoadStyles]',\r\n})\r\nexport class RkLoadStylesDirective implements OnInit, OnDestroy {\r\n @Input('rkLoadStyles') hrefs: string[] | string = [];\r\n\r\n // (可选) 输出加载完成事件,以便父组件可以响应\r\n @Output() stylesLoaded = new EventEmitter<ILoadResult[]>();\r\n\r\n private subscription: Subscription | undefined;\r\n private styleUrls: string[] = [];\r\n\r\n constructor(private styleLoader: RkStyleLoaderService) {}\r\n\r\n ngOnInit(): void {\r\n this.styleUrls = Array.isArray(this.hrefs) ? this.hrefs : [this.hrefs];\r\n if (this.styleUrls.length > 0) {\r\n this.subscription = this.styleLoader.load(...this.styleUrls).subscribe((results) => {\r\n this.stylesLoaded.emit(results);\r\n });\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n // 指令销毁时,自动调用 unload,服务内部会处理引用计数\r\n if (this.styleUrls.length > 0) {\r\n this.styleLoader.unload(...this.styleUrls);\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RkAuthDirective } from './auth.directive';\r\nimport { RkStringTemplateOutletDirective } from './string.template.outlet.directive';\r\nimport { RkLoadStylesDirective } from './load.styles.directive';\r\n\r\n@NgModule({\r\n declarations: [RkAuthDirective, RkStringTemplateOutletDirective, RkLoadStylesDirective],\r\n exports: [RkAuthDirective, RkStringTemplateOutletDirective, RkLoadStylesDirective],\r\n})\r\nexport class RkDirectivesModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reskin-core-directives.js","sources":["../../../library/core/directives/auth.directive.ts","../../../library/core/directives/string.template.outlet.directive.ts","../../../library/core/directives/load.styles.directive.ts","../../../library/core/directives/directives.module.ts","../../../library/core/directives/reskin-core-directives.ts"],"sourcesContent":["import { Directive, Input, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { map, takeUntil } from 'rxjs/operators';\r\nimport { RkMenuService } from '@reskin/core/services';\r\n\r\n/**\r\n * 权限指令上下文\r\n */\r\nexport interface RkAuthContext<T = any> {\r\n /** 隐式上下文,包含匹配的菜单数据 */\r\n $implicit: T;\r\n /** 权限验证状态 */\r\n status: boolean;\r\n}\r\n\r\n/**\r\n * 权限指令\r\n * 根据权限标识符控制模板的显示与隐藏\r\n *\r\n * @example\r\n * ```html\r\n * <!-- 基础用法 -->\r\n * <div *rkAuth=\"'user:edit'\">有编辑权限才显示</div>\r\n *\r\n * <!-- 多个权限(或关系) -->\r\n * <div *rkAuth=\"['user:edit', 'user:delete']\">有任一权限即显示</div>\r\n *\r\n * <!-- 使用 then/else 模板 -->\r\n * <ng-container *rkAuth=\"'user:edit'; then hasAuth; else noAuth\"></ng-container>\r\n * <ng-template #hasAuth let-menu>\r\n * <p>有权限,菜单信息:{{ menu | json }}</p>\r\n * </ng-template>\r\n * <ng-template #noAuth>\r\n * <p>无权限</p>\r\n * </ng-template>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[rkAuth]',\r\n})\r\nexport class RkAuthDirective implements OnDestroy {\r\n private condition: string | string[] = '';\r\n private thenTemplateRef?: TemplateRef<any>;\r\n private elseTemplateRef?: TemplateRef<any>;\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n /**\r\n * 权限标识符\r\n * 传递多个标识符时,匹配按\"或\"运算\r\n */\r\n @Input()\r\n set rkAuth(condition: string | string[]) {\r\n this.condition = condition;\r\n this.updateView();\r\n }\r\n\r\n /**\r\n * 有权限时显示的模板\r\n */\r\n @Input()\r\n set rkAuthThen(templateRef: TemplateRef<any>) {\r\n this.thenTemplateRef = templateRef;\r\n this.updateView();\r\n }\r\n\r\n /**\r\n * 无权限时显示的模板\r\n */\r\n @Input()\r\n set rkAuthElse(templateRef: TemplateRef<any>) {\r\n this.elseTemplateRef = templateRef;\r\n this.updateView();\r\n }\r\n\r\n constructor(\r\n private menuService: RkMenuService,\r\n private viewContainerRef: ViewContainerRef,\r\n public templateRef: TemplateRef<any>,\r\n ) {\r\n this.thenTemplateRef = templateRef;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * 更新视图显示\r\n */\r\n private updateView(): void {\r\n if (!this.condition) {\r\n this.viewContainerRef.clear();\r\n return;\r\n }\r\n\r\n this.checkAuth(this.condition)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((context) => {\r\n this.renderView(context);\r\n });\r\n }\r\n\r\n /**\r\n * 渲染视图\r\n */\r\n private renderView(context: RkAuthContext): void {\r\n this.viewContainerRef.clear();\r\n\r\n if (context.status && this.thenTemplateRef) {\r\n this.viewContainerRef.createEmbeddedView(this.thenTemplateRef, context);\r\n } else if (!context.status && this.elseTemplateRef) {\r\n this.viewContainerRef.createEmbeddedView(this.elseTemplateRef, context);\r\n }\r\n }\r\n\r\n /**\r\n * 检查权限\r\n */\r\n private checkAuth(tags: string | string[]) {\r\n const tagList: string[] = Array.isArray(tags) ? tags : [tags];\r\n\r\n return this.menuService.requestData().pipe(\r\n map((response) => {\r\n const matchedMenus = response.data.filter((menu) => tagList.includes(menu.SYSTEM_RESOURCE_GUARD_ID));\r\n\r\n const context: RkAuthContext = {\r\n $implicit: Array.isArray(tags) ? matchedMenus : matchedMenus[0] || null,\r\n status: matchedMenus.length > 0,\r\n };\r\n\r\n return context;\r\n }),\r\n );\r\n }\r\n}\r\n","import { Directive, EmbeddedViewRef, Input, OnChanges, SimpleChange, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core';\r\n\r\n/**\r\n * 字符串模板输出上下文\r\n */\r\nexport class RkStringTemplateOutletContext<T = any> {\r\n /** 隐式上下文值 */\r\n public $implicit: T | null = null;\r\n}\r\n\r\n/**\r\n * 字符串模板输出指令\r\n * 支持动态渲染字符串或 TemplateRef\r\n *\r\n * @example\r\n * ```html\r\n * <!-- 渲染字符串 -->\r\n * <ng-container *rkStringTemplateOutlet=\"'Hello World'\">\r\n * <ng-template>默认模板</ng-template>\r\n * </ng-container>\r\n *\r\n * <!-- 渲染 TemplateRef -->\r\n * <ng-container *rkStringTemplateOutlet=\"customTemplate; context: { $implicit: data }\">\r\n * </ng-container>\r\n * <ng-template #customTemplate let-item>\r\n * <div>{{ item }}</div>\r\n * </ng-template>\r\n *\r\n * <!-- 动态切换 -->\r\n * <ng-container *rkStringTemplateOutlet=\"isTemplate ? templateRef : 'Static Text'\">\r\n * </ng-container>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[rkStringTemplateOutlet]',\r\n})\r\nexport class RkStringTemplateOutletDirective<T = unknown> implements OnChanges {\r\n private embeddedViewRef: EmbeddedViewRef<RkStringTemplateOutletContext<T>> | null = null;\r\n private context = new RkStringTemplateOutletContext<T>();\r\n\r\n /**\r\n * 输出内容\r\n * 可以是字符串或 TemplateRef\r\n */\r\n @Input() rkStringTemplateOutlet: T | TemplateRef<RkStringTemplateOutletContext<T>> | null = null;\r\n\r\n /**\r\n * 模板上下文\r\n * 当 rkStringTemplateOutlet 是 TemplateRef 时使用\r\n */\r\n @Input() rkStringTemplateOutletContext: RkStringTemplateOutletContext<T> | null = null;\r\n\r\n /**\r\n * 类型守卫\r\n * 用于 Angular 模板类型检查\r\n */\r\n static rkTemplateContextGuard<T>(\r\n _dir: RkStringTemplateOutletDirective<T>,\r\n _ctx: any,\r\n ): _ctx is RkStringTemplateOutletContext<T> {\r\n return true;\r\n }\r\n\r\n constructor(\r\n private viewContainerRef: ViewContainerRef,\r\n private templateRef: TemplateRef<RkStringTemplateOutletContext<T>>,\r\n ) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const { rkStringTemplateOutlet, rkStringTemplateOutletContext } = changes;\r\n\r\n // 更新隐式上下文\r\n if (rkStringTemplateOutlet) {\r\n this.context.$implicit = rkStringTemplateOutlet.currentValue;\r\n }\r\n\r\n // 判断是否需要重建视图\r\n if (this.shouldRecreateView(rkStringTemplateOutlet, rkStringTemplateOutletContext)) {\r\n this.recreateView();\r\n } else {\r\n this.updateContext();\r\n }\r\n }\r\n\r\n /**\r\n * 判断是否需要重建视图\r\n */\r\n private shouldRecreateView(outletChange?: SimpleChange, contextChange?: SimpleChange): boolean {\r\n // 首次变更需要创建视图\r\n if (outletChange?.firstChange) {\r\n return true;\r\n }\r\n\r\n // outlet 在 TemplateRef 和非 TemplateRef 之间切换时需要重建\r\n if (outletChange && this.isOutletTypeChanged(outletChange)) {\r\n return true;\r\n }\r\n\r\n // 上下文结构变化时需要重建\r\n if (contextChange && this.isContextShapeChanged(contextChange)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 检查 outlet 类型是否变化\r\n */\r\n private isOutletTypeChanged(change: SimpleChange): boolean {\r\n const isPreviousTemplate = change.previousValue instanceof TemplateRef;\r\n const isCurrentTemplate = change.currentValue instanceof TemplateRef;\r\n return isPreviousTemplate !== isCurrentTemplate;\r\n }\r\n\r\n /**\r\n * 检查上下文结构是否变化\r\n */\r\n private isContextShapeChanged(change: SimpleChange): boolean {\r\n const prevKeys = Object.keys(change.previousValue || {});\r\n const currKeys = Object.keys(change.currentValue || {});\r\n\r\n if (prevKeys.length !== currKeys.length) {\r\n return true;\r\n }\r\n\r\n return currKeys.some((key) => !prevKeys.includes(key));\r\n }\r\n\r\n /**\r\n * 重建视图\r\n */\r\n private recreateView(): void {\r\n this.viewContainerRef.clear();\r\n\r\n const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;\r\n const templateRef = isTemplateRef ? this.rkStringTemplateOutlet : this.templateRef;\r\n const context = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;\r\n\r\n this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(\r\n templateRef as TemplateRef<RkStringTemplateOutletContext<T>>,\r\n context || this.context,\r\n );\r\n }\r\n\r\n /**\r\n * 更新视图上下文\r\n */\r\n private updateContext(): void {\r\n if (!this.embeddedViewRef) {\r\n return;\r\n }\r\n\r\n const isTemplateRef = this.rkStringTemplateOutlet instanceof TemplateRef;\r\n const newContext = isTemplateRef ? this.rkStringTemplateOutletContext : this.context;\r\n const viewContext = this.embeddedViewRef.context;\r\n\r\n if (newContext) {\r\n Object.keys(newContext).forEach((key) => {\r\n (viewContext as any)[key] = (newContext as any)[key];\r\n });\r\n }\r\n }\r\n}\r\n","import { Directive, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { ILoadResult, RkStyleLoaderService } from '@reskin/core/services';\r\n\r\n/**\r\n * 样式按需加载指令\r\n * 在指令初始化时加载指定的样式文件,销毁时自动卸载\r\n *\r\n * @example\r\n * ```html\r\n * <!-- 加载单个样式 -->\r\n * <div [rkLoadStyles]=\"'assets/styles/theme.css'\">内容</div>\r\n *\r\n * <!-- 加载多个样式 -->\r\n * <div [rkLoadStyles]=\"['assets/styles/theme.css', 'assets/styles/components.css']\">内容</div>\r\n *\r\n * <!-- 监听加载完成事件 -->\r\n * <div [rkLoadStyles]=\"styleUrls\" (stylesLoaded)=\"onLoaded($event)\">内容</div>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[rkLoadStyles]',\r\n})\r\nexport class RkLoadStylesDirective implements OnInit, OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n private styleUrls: string[] = [];\r\n\r\n /**\r\n * 样式文件路径\r\n * 可以是单个路径字符串或路径数组\r\n */\r\n @Input('rkLoadStyles') hrefs: string | string[] = [];\r\n\r\n /**\r\n * 样式加载完成事件\r\n * 返回每个样式文件的加载结果\r\n */\r\n @Output() stylesLoaded = new EventEmitter<ILoadResult[]>();\r\n\r\n constructor(private styleLoaderService: RkStyleLoaderService) {}\r\n\r\n ngOnInit(): void {\r\n this.loadStyles();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.unloadStyles();\r\n }\r\n\r\n /**\r\n * 加载样式文件\r\n */\r\n private loadStyles(): void {\r\n this.styleUrls = this.normalizeHrefs(this.hrefs);\r\n\r\n if (this.styleUrls.length === 0) {\r\n return;\r\n }\r\n\r\n this.styleLoaderService\r\n .load(...this.styleUrls)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (results) => {\r\n this.stylesLoaded.emit(results);\r\n this.logLoadResults(results);\r\n },\r\n error: (error) => {\r\n console.error('[RkLoadStyles] 样式加载失败:', error);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * 卸载样式文件\r\n */\r\n private unloadStyles(): void {\r\n if (this.styleUrls.length > 0) {\r\n this.styleLoaderService.unload(...this.styleUrls);\r\n }\r\n }\r\n\r\n /**\r\n * 标准化 hrefs 输入为数组\r\n */\r\n private normalizeHrefs(hrefs: string | string[]): string[] {\r\n if (!hrefs) {\r\n return [];\r\n }\r\n return Array.isArray(hrefs) ? hrefs : [hrefs];\r\n }\r\n\r\n /**\r\n * 记录加载结果(仅在开发模式)\r\n */\r\n private logLoadResults(results: ILoadResult[]): void {\r\n // 开发模式下记录加载结果\r\n results.forEach((result) => {\r\n if (result.success) {\r\n console.log(`[RkLoadStyles] 样式加载成功: ${result.href}`);\r\n } else {\r\n console.error(`[RkLoadStyles] 样式加载失败: ${result.href}`, result.error);\r\n }\r\n });\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RkAuthDirective } from './auth.directive';\r\nimport { RkStringTemplateOutletDirective } from './string.template.outlet.directive';\r\nimport { RkLoadStylesDirective } from './load.styles.directive';\r\n\r\n@NgModule({\r\n declarations: [RkAuthDirective, RkStringTemplateOutletDirective, RkLoadStylesDirective],\r\n exports: [RkAuthDirective, RkStringTemplateOutletDirective, RkLoadStylesDirective],\r\n})\r\nexport class RkDirectivesModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, Injectable, Inject } from '@angular/core';
|
|
2
|
+
import { InjectionToken, Injectable, Optional, Inject } from '@angular/core';
|
|
3
|
+
import { of } from 'rxjs';
|
|
3
4
|
import { filter, map, catchError } from 'rxjs/operators';
|
|
4
5
|
import * as i1 from '@reskin/core/services';
|
|
5
6
|
import * as i2 from '@angular/router';
|
|
@@ -8,60 +9,139 @@ import * as i2 from '@angular/router';
|
|
|
8
9
|
* 路由守卫配置注入令牌
|
|
9
10
|
*/
|
|
10
11
|
const RK_ROUTER_GUARD_CONFIG = new InjectionToken('router_guard_config');
|
|
12
|
+
/**
|
|
13
|
+
* 路由守卫选项注入令牌
|
|
14
|
+
*/
|
|
15
|
+
const RK_ROUTER_GUARD_OPTIONS = new InjectionToken('router_guard_options');
|
|
11
16
|
/**
|
|
12
17
|
* 路由守卫提供者配置函数
|
|
13
18
|
*
|
|
14
19
|
* @param urls - 路由守卫配置数组,包含需要保护的路由配置信息
|
|
20
|
+
* @param options - 可选的守卫选项配置
|
|
15
21
|
* @returns 返回Angular依赖注入的Provider数组,用于配置路由守卫
|
|
16
22
|
*/
|
|
17
|
-
function providerRouterGuard(urls) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
{ provide:
|
|
21
|
-
|
|
23
|
+
function providerRouterGuard(urls, options) {
|
|
24
|
+
const providers = [{ provide: RK_ROUTER_GUARD_CONFIG, useValue: urls }];
|
|
25
|
+
if (options) {
|
|
26
|
+
providers.push({ provide: RK_ROUTER_GUARD_OPTIONS, useValue: options });
|
|
27
|
+
}
|
|
28
|
+
return providers;
|
|
22
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* 路由权限守卫
|
|
32
|
+
*
|
|
33
|
+
* 用于保护路由,确保用户只能访问其被授权的路由。
|
|
34
|
+
* 支持权限继承机制和自定义权限检查逻辑。
|
|
35
|
+
*/
|
|
23
36
|
class RkAuthGuard {
|
|
24
|
-
constructor(config, menu, router) {
|
|
37
|
+
constructor(config, options, menu, router) {
|
|
25
38
|
this.config = config;
|
|
39
|
+
this.options = options;
|
|
26
40
|
this.menu = menu;
|
|
27
41
|
this.router = router;
|
|
28
42
|
}
|
|
29
43
|
canActivateChild(childRoute, state) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
44
|
+
var _a;
|
|
45
|
+
// 检查路由数据中是否配置跳过权限检查
|
|
46
|
+
if (childRoute.data['skipAuth'] === true) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
// 执行前置钩子
|
|
50
|
+
if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.beforeCheck) && !this.options.beforeCheck(childRoute, state)) {
|
|
51
|
+
return this.handleNoAccess(state.url);
|
|
52
|
+
}
|
|
53
|
+
return this.menu.requestData().pipe(filter((json) => json.code === 0), map((json) => json.data), map((menus) => this.checkAccess(menus, state.url)), catchError((error) => {
|
|
54
|
+
console.error('路由权限检查失败:', error);
|
|
55
|
+
return of(this.handleNoAccess(state.url));
|
|
33
56
|
}));
|
|
34
57
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
58
|
+
/**
|
|
59
|
+
* 检查用户是否有权限访问指定路由
|
|
60
|
+
*
|
|
61
|
+
* @param menus - 用户菜单权限数据
|
|
62
|
+
* @param url - 目标路由地址
|
|
63
|
+
* @returns 返回 true 允许访问,返回 false 或 UrlTree 拒绝访问
|
|
64
|
+
*/
|
|
65
|
+
checkAccess(menus, url) {
|
|
66
|
+
if (!menus || menus.length === 0) {
|
|
67
|
+
console.error('此账号无任何功能权限');
|
|
68
|
+
return this.handleNoAccess(url);
|
|
38
69
|
}
|
|
39
|
-
|
|
70
|
+
// 移除查询参数,只保留路径部分
|
|
71
|
+
const routerUrl = this.normalizeUrl(url);
|
|
72
|
+
// 构建用户权限路由集合
|
|
40
73
|
const authRoutes = new Set(menus.map((m) => m.SYSTEM_RESOURCE_URL));
|
|
74
|
+
// 直接权限检查
|
|
41
75
|
if (authRoutes.has(routerUrl)) {
|
|
42
76
|
return true;
|
|
43
77
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
78
|
+
// 继承权限检查
|
|
79
|
+
if (this.hasInheritedPermission(routerUrl, authRoutes)) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
// 无权限访问
|
|
83
|
+
return this.handleNoAccess(url);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 检查是否有继承的权限
|
|
87
|
+
*
|
|
88
|
+
* @param routerUrl - 标准化后的路由地址
|
|
89
|
+
* @param authRoutes - 用户权限路由集合
|
|
90
|
+
* @returns 返回 true 表示有继承权限
|
|
91
|
+
*/
|
|
92
|
+
hasInheritedPermission(routerUrl, authRoutes) {
|
|
93
|
+
if (!this.config || this.config.length === 0) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
// 查找匹配的继承配置
|
|
97
|
+
const matchedConfigs = this.config.filter((item) => {
|
|
98
|
+
return item.extends.some((route) => this.matchRoute(route, routerUrl));
|
|
99
|
+
});
|
|
100
|
+
// 检查是否有任一配置的 url 在用户权限中
|
|
101
|
+
return matchedConfigs.some((item) => authRoutes.has(item.url));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 匹配路由规则
|
|
105
|
+
*
|
|
106
|
+
* @param pattern - 路由模式(支持 ** 通配符)
|
|
107
|
+
* @param path - 实际路由路径
|
|
108
|
+
* @returns 返回 true 表示匹配成功
|
|
109
|
+
*/
|
|
110
|
+
matchRoute(pattern, path) {
|
|
111
|
+
if (pattern.includes('**')) {
|
|
112
|
+
const regexPattern = pattern.replace(/\*\*/g, '.*');
|
|
113
|
+
return new RegExp(`^${regexPattern}$`).test(path);
|
|
51
114
|
}
|
|
52
|
-
|
|
53
|
-
return false;
|
|
115
|
+
return pattern === path;
|
|
54
116
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
117
|
+
/**
|
|
118
|
+
* 标准化URL,移除查询参数和片段标识符
|
|
119
|
+
*
|
|
120
|
+
* @param url - 原始URL
|
|
121
|
+
* @returns 标准化后的URL
|
|
122
|
+
*/
|
|
123
|
+
normalizeUrl(url) {
|
|
124
|
+
return url.replace(/[?#].*/, '');
|
|
58
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* 处理无权限访问
|
|
128
|
+
*
|
|
129
|
+
* @param url - 被拒绝访问的路由地址
|
|
130
|
+
* @returns 返回 false 或 UrlTree
|
|
131
|
+
*/
|
|
59
132
|
handleNoAccess(url) {
|
|
133
|
+
var _a, _b;
|
|
60
134
|
console.error(`无权限访问路由地址: ${url}`);
|
|
61
|
-
|
|
135
|
+
// 使用自定义回调
|
|
136
|
+
if ((_a = this.options) === null || _a === void 0 ? void 0 : _a.onAccessDenied) {
|
|
137
|
+
return this.options.onAccessDenied(url);
|
|
138
|
+
}
|
|
139
|
+
// 使用自定义未授权路径或默认路径
|
|
140
|
+
const unauthorizedPath = ((_b = this.options) === null || _b === void 0 ? void 0 : _b.unauthorizedPath) || '/errors/401';
|
|
141
|
+
return this.router.createUrlTree([unauthorizedPath]);
|
|
62
142
|
}
|
|
63
143
|
}
|
|
64
|
-
RkAuthGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkAuthGuard, deps: [{ token: RK_ROUTER_GUARD_CONFIG }, { token: i1.RkMenuService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
144
|
+
RkAuthGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkAuthGuard, deps: [{ token: RK_ROUTER_GUARD_CONFIG, optional: true }, { token: RK_ROUTER_GUARD_OPTIONS, optional: true }, { token: i1.RkMenuService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
65
145
|
RkAuthGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkAuthGuard, providedIn: 'root' });
|
|
66
146
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkAuthGuard, decorators: [{
|
|
67
147
|
type: Injectable,
|
|
@@ -69,13 +149,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
69
149
|
providedIn: 'root',
|
|
70
150
|
}]
|
|
71
151
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
152
|
+
type: Optional
|
|
153
|
+
}, {
|
|
72
154
|
type: Inject,
|
|
73
155
|
args: [RK_ROUTER_GUARD_CONFIG]
|
|
156
|
+
}] }, { type: undefined, decorators: [{
|
|
157
|
+
type: Optional
|
|
158
|
+
}, {
|
|
159
|
+
type: Inject,
|
|
160
|
+
args: [RK_ROUTER_GUARD_OPTIONS]
|
|
74
161
|
}] }, { type: i1.RkMenuService }, { type: i2.Router }]; } });
|
|
75
162
|
|
|
76
163
|
/**
|
|
77
164
|
* Generated bundle index. Do not edit.
|
|
78
165
|
*/
|
|
79
166
|
|
|
80
|
-
export { RK_ROUTER_GUARD_CONFIG, RkAuthGuard, providerRouterGuard };
|
|
167
|
+
export { RK_ROUTER_GUARD_CONFIG, RK_ROUTER_GUARD_OPTIONS, RkAuthGuard, providerRouterGuard };
|
|
81
168
|
//# sourceMappingURL=reskin-core-guards.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reskin-core-guards.js","sources":["../../../library/core/guards/auth.guard.ts","../../../library/core/guards/reskin-core-guards.ts"],"sourcesContent":["import { Inject, Injectable, InjectionToken, Provider } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, CanActivateChild, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\r\nimport { Observable } from 'rxjs';\r\nimport { filter, map, catchError } from 'rxjs/operators';\r\nimport { RkMenuService } from '@reskin/core/services';\r\n\r\n/**\r\n * 路由守卫配置注入令牌\r\n */\r\nexport const RK_ROUTER_GUARD_CONFIG = new InjectionToken('router_guard_config');\r\n\r\n/**\r\n * 路由守卫配置\r\n */\r\nexport interface IRouterGuardConfig {\r\n /**\r\n * 路由地址\r\n */\r\n url: string;\r\n /**\r\n * 继承的权限\r\n */\r\n extends: string[];\r\n}\r\n\r\n/**\r\n * 路由守卫提供者配置函数\r\n *\r\n * @param urls - 路由守卫配置数组,包含需要保护的路由配置信息\r\n * @returns 返回Angular依赖注入的Provider数组,用于配置路由守卫\r\n */\r\nexport function providerRouterGuard(urls: IRouterGuardConfig[]): Provider[] {\r\n return [\r\n // 路由守卫配置\r\n { provide: RK_ROUTER_GUARD_CONFIG, useValue: urls },\r\n ];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RkAuthGuard implements CanActivateChild {\r\n constructor(\r\n @Inject(RK_ROUTER_GUARD_CONFIG) private config: IRouterGuardConfig[],\r\n private menu: RkMenuService,\r\n private router: Router,\r\n ) {}\r\n\r\n canActivateChild(\r\n childRoute: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot,\r\n ): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {\r\n return this.menu.requestData().pipe(\r\n filter((json) => json.code === 0),\r\n map((json) => json.data),\r\n map((menus) => this.checkAccess(menus, childRoute, state.url)),\r\n catchError(() => {\r\n this.handleNoAccess(state.url);\r\n return [false];\r\n }),\r\n );\r\n }\r\n\r\n private checkAccess(menus: any[], childRoute: ActivatedRouteSnapshot, url: string): boolean | UrlTree {\r\n if (!menus.length) {\r\n throw new Error(`此账号无任何功能权限.`);\r\n }\r\n\r\n const routerUrl = url.replace(/\\?.*/, '');\r\n const authRoutes = new Set<string>(menus.map((m) => m.SYSTEM_RESOURCE_URL));\r\n\r\n if (authRoutes.has(routerUrl)) {\r\n return true;\r\n }\r\n\r\n if (this.config && this.config.length > 0) {\r\n const extendRoutes = this.config.filter((item) => {\r\n return item.extends.some((route: string) => (route.includes('**') ? this.match(route, routerUrl) : route === routerUrl));\r\n });\r\n if (extendRoutes.length > 0) {\r\n return extendRoutes.some((item) => authRoutes.has(item.url));\r\n }\r\n }\r\n\r\n this.handleNoAccess(url);\r\n return false;\r\n }\r\n\r\n private match(pattern: string, path: string): boolean {\r\n const regexPattern = pattern.replace(/\\*\\*/g, '.*');\r\n return new RegExp(`^${regexPattern}$`).test(path);\r\n }\r\n\r\n private handleNoAccess(url: string): void {\r\n console.error(`无权限访问路由地址: ${url}`);\r\n this.router.navigate(['/errors/401']).then();\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reskin-core-guards.js","sources":["../../../library/core/guards/auth.guard.ts","../../../library/core/guards/reskin-core-guards.ts"],"sourcesContent":["import { Inject, Injectable, InjectionToken, Optional, Provider } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, CanActivateChild, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\r\nimport { Observable, of } from 'rxjs';\r\nimport { catchError, filter, map } from 'rxjs/operators';\r\nimport { RkMenuService } from '@reskin/core/services';\r\n\r\n/**\r\n * 路由守卫配置注入令牌\r\n */\r\nexport const RK_ROUTER_GUARD_CONFIG = new InjectionToken<IRouterGuardConfig[]>('router_guard_config');\r\n\r\n/**\r\n * 路由守卫选项注入令牌\r\n */\r\nexport const RK_ROUTER_GUARD_OPTIONS = new InjectionToken<IAuthGuardOptions>('router_guard_options');\r\n\r\n/**\r\n * 菜单数据接口\r\n */\r\nexport interface IMenuData {\r\n /**\r\n * 系统资源URL\r\n */\r\n SYSTEM_RESOURCE_URL: string;\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * 路由守卫配置\r\n */\r\nexport interface IRouterGuardConfig {\r\n /**\r\n * 路由地址\r\n */\r\n url: string;\r\n /**\r\n * 继承的权限\r\n */\r\n extends: string[];\r\n}\r\n\r\n/**\r\n * 路由守卫选项配置\r\n */\r\nexport interface IAuthGuardOptions {\r\n /**\r\n * 无权限时的跳转路径\r\n * @default '/errors/401'\r\n */\r\n unauthorizedPath?: string;\r\n /**\r\n * 自定义无权限处理回调\r\n * @param url - 被拒绝访问的路由地址\r\n * @returns 返回 false 阻止导航,返回 UrlTree 进行重定向,返回 true 允许访问\r\n */\r\n onAccessDenied?: (url: string) => boolean | UrlTree;\r\n /**\r\n * 权限检查前的钩子函数\r\n * @param route - 激活的路由快照\r\n * @param state - 路由状态快照\r\n * @returns 返回 false 跳过权限检查并拒绝访问,返回 true 继续权限检查\r\n */\r\n beforeCheck?: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => boolean;\r\n}\r\n\r\n/**\r\n * 路由守卫提供者配置函数\r\n *\r\n * @param urls - 路由守卫配置数组,包含需要保护的路由配置信息\r\n * @param options - 可选的守卫选项配置\r\n * @returns 返回Angular依赖注入的Provider数组,用于配置路由守卫\r\n */\r\nexport function providerRouterGuard(urls: IRouterGuardConfig[], options?: IAuthGuardOptions): Provider[] {\r\n const providers: Provider[] = [{ provide: RK_ROUTER_GUARD_CONFIG, useValue: urls }];\r\n\r\n if (options) {\r\n providers.push({ provide: RK_ROUTER_GUARD_OPTIONS, useValue: options });\r\n }\r\n\r\n return providers;\r\n}\r\n\r\n/**\r\n * 路由权限守卫\r\n *\r\n * 用于保护路由,确保用户只能访问其被授权的路由。\r\n * 支持权限继承机制和自定义权限检查逻辑。\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RkAuthGuard implements CanActivateChild {\r\n constructor(\r\n @Optional() @Inject(RK_ROUTER_GUARD_CONFIG) private config: IRouterGuardConfig[] | null,\r\n @Optional() @Inject(RK_ROUTER_GUARD_OPTIONS) private options: IAuthGuardOptions | null,\r\n private menu: RkMenuService,\r\n private router: Router,\r\n ) {}\r\n\r\n canActivateChild(\r\n childRoute: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot,\r\n ): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {\r\n // 检查路由数据中是否配置跳过权限检查\r\n if (childRoute.data['skipAuth'] === true) {\r\n return true;\r\n }\r\n\r\n // 执行前置钩子\r\n if (this.options?.beforeCheck && !this.options.beforeCheck(childRoute, state)) {\r\n return this.handleNoAccess(state.url);\r\n }\r\n\r\n return this.menu.requestData().pipe(\r\n filter((json) => json.code === 0),\r\n map((json) => json.data as IMenuData[]),\r\n map((menus) => this.checkAccess(menus, state.url)),\r\n catchError((error) => {\r\n console.error('路由权限检查失败:', error);\r\n return of(this.handleNoAccess(state.url));\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * 检查用户是否有权限访问指定路由\r\n *\r\n * @param menus - 用户菜单权限数据\r\n * @param url - 目标路由地址\r\n * @returns 返回 true 允许访问,返回 false 或 UrlTree 拒绝访问\r\n */\r\n private checkAccess(menus: IMenuData[], url: string): boolean | UrlTree {\r\n if (!menus || menus.length === 0) {\r\n console.error('此账号无任何功能权限');\r\n return this.handleNoAccess(url);\r\n }\r\n\r\n // 移除查询参数,只保留路径部分\r\n const routerUrl = this.normalizeUrl(url);\r\n\r\n // 构建用户权限路由集合\r\n const authRoutes = new Set<string>(menus.map((m) => m.SYSTEM_RESOURCE_URL));\r\n\r\n // 直接权限检查\r\n if (authRoutes.has(routerUrl)) {\r\n return true;\r\n }\r\n\r\n // 继承权限检查\r\n if (this.hasInheritedPermission(routerUrl, authRoutes)) {\r\n return true;\r\n }\r\n\r\n // 无权限访问\r\n return this.handleNoAccess(url);\r\n }\r\n\r\n /**\r\n * 检查是否有继承的权限\r\n *\r\n * @param routerUrl - 标准化后的路由地址\r\n * @param authRoutes - 用户权限路由集合\r\n * @returns 返回 true 表示有继承权限\r\n */\r\n private hasInheritedPermission(routerUrl: string, authRoutes: Set<string>): boolean {\r\n if (!this.config || this.config.length === 0) {\r\n return false;\r\n }\r\n\r\n // 查找匹配的继承配置\r\n const matchedConfigs = this.config.filter((item) => {\r\n return item.extends.some((route: string) => this.matchRoute(route, routerUrl));\r\n });\r\n\r\n // 检查是否有任一配置的 url 在用户权限中\r\n return matchedConfigs.some((item) => authRoutes.has(item.url));\r\n }\r\n\r\n /**\r\n * 匹配路由规则\r\n *\r\n * @param pattern - 路由模式(支持 ** 通配符)\r\n * @param path - 实际路由路径\r\n * @returns 返回 true 表示匹配成功\r\n */\r\n private matchRoute(pattern: string, path: string): boolean {\r\n if (pattern.includes('**')) {\r\n const regexPattern = pattern.replace(/\\*\\*/g, '.*');\r\n return new RegExp(`^${regexPattern}$`).test(path);\r\n }\r\n return pattern === path;\r\n }\r\n\r\n /**\r\n * 标准化URL,移除查询参数和片段标识符\r\n *\r\n * @param url - 原始URL\r\n * @returns 标准化后的URL\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/[?#].*/, '');\r\n }\r\n\r\n /**\r\n * 处理无权限访问\r\n *\r\n * @param url - 被拒绝访问的路由地址\r\n * @returns 返回 false 或 UrlTree\r\n */\r\n private handleNoAccess(url: string): boolean | UrlTree {\r\n console.error(`无权限访问路由地址: ${url}`);\r\n\r\n // 使用自定义回调\r\n if (this.options?.onAccessDenied) {\r\n return this.options.onAccessDenied(url);\r\n }\r\n\r\n // 使用自定义未授权路径或默认路径\r\n const unauthorizedPath = this.options?.unauthorizedPath || '/errors/401';\r\n return this.router.createUrlTree([unauthorizedPath]);\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;AAMA;;AAEG;MACU,sBAAsB,GAAG,IAAI,cAAc,CAAuB,qBAAqB,EAAE;AAEtG;;AAEG;MACU,uBAAuB,GAAG,IAAI,cAAc,CAAoB,sBAAsB,EAAE;AAmDrG;;;;;;AAMG;AACa,SAAA,mBAAmB,CAAC,IAA0B,EAAE,OAA2B,EAAA;AACvF,IAAA,MAAM,SAAS,GAAe,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAEpF,IAAA,IAAI,OAAO,EAAE;AACT,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3E,KAAA;AAED,IAAA,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;;AAKG;MAIU,WAAW,CAAA;AACpB,IAAA,WAAA,CACwD,MAAmC,EAClC,OAAiC,EAC9E,IAAmB,EACnB,MAAc,EAAA;QAH8B,IAAM,CAAA,MAAA,GAAN,MAAM,CAA6B;QAClC,IAAO,CAAA,OAAA,GAAP,OAAO,CAA0B;QAC9E,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAe;QACnB,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KACtB;IAEJ,gBAAgB,CACZ,UAAkC,EAClC,KAA0B,EAAA;;;QAG1B,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;AACtC,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;;AAGD,QAAA,IAAI,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,WAAW,KAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;YAC3E,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACzC,SAAA;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAC/B,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,EACjC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAmB,CAAC,EACvC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAClD,UAAU,CAAC,CAAC,KAAK,KAAI;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAClC,OAAO,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;SAC7C,CAAC,CACL,CAAC;KACL;AAED;;;;;;AAMG;IACK,WAAW,CAAC,KAAkB,EAAE,GAAW,EAAA;QAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,YAAA,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAC5B,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnC,SAAA;;QAGD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;;AAGzC,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;;AAG5E,QAAA,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;;QAGD,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;AACpD,YAAA,OAAO,IAAI,CAAC;AACf,SAAA;;AAGD,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;KACnC;AAED;;;;;;AAMG;IACK,sBAAsB,CAAC,SAAiB,EAAE,UAAuB,EAAA;AACrE,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1C,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;;QAGD,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;YAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAa,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AACnF,SAAC,CAAC,CAAC;;AAGH,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;KAClE;AAED;;;;;;AAMG;IACK,UAAU,CAAC,OAAe,EAAE,IAAY,EAAA;AAC5C,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACxB,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACpD,YAAA,OAAO,IAAI,MAAM,CAAC,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD,SAAA;QACD,OAAO,OAAO,KAAK,IAAI,CAAC;KAC3B;AAED;;;;;AAKG;AACK,IAAA,YAAY,CAAC,GAAW,EAAA;QAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;KACpC;AAED;;;;;AAKG;AACK,IAAA,cAAc,CAAC,GAAW,EAAA;;AAC9B,QAAA,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAA,CAAE,CAAC,CAAC;;AAGnC,QAAA,IAAI,MAAA,IAAI,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,cAAc,EAAE;YAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AAC3C,SAAA;;QAGD,MAAM,gBAAgB,GAAG,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,gBAAgB,KAAI,aAAa,CAAC;QACzE,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;KACxD;;yGAjIQ,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAEI,sBAAsB,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EACtB,uBAAuB,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAHtC,WAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFR,MAAM,EAAA,CAAA,CAAA;4FAET,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA,CAAA;;0BAGQ,QAAQ;;0BAAI,MAAM;2BAAC,sBAAsB,CAAA;;0BACzC,QAAQ;;0BAAI,MAAM;2BAAC,uBAAuB,CAAA;;;AC9FnD;;AAEG;;;;"}
|