From 4a725465aeb47e2ff476b75510ec7ca0dca27f99 Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Tue, 26 Apr 2022 21:21:46 +0800 Subject: [PATCH] edit --- proxy.conf.js | 2 +- .../api-auth-modal.component.ts | 10 +- .../menu-tree/menu-tree.component.html | 12 +- .../menu-tree/menu-tree.component.ts | 487 ++++++------------ 4 files changed, 170 insertions(+), 341 deletions(-) diff --git a/proxy.conf.js b/proxy.conf.js index ff162fda..d9d60dfc 100644 --- a/proxy.conf.js +++ b/proxy.conf.js @@ -30,7 +30,7 @@ module.exports = { // }, '//api': { target: { - host: 'tms-api-dev.eascs.com', + host: 'tms-api-test.eascs.com', protocol: 'https:', port: 443 }, diff --git a/src/app/routes/sys-setting/components/organization-management/api-auth-modal/api-auth-modal.component.ts b/src/app/routes/sys-setting/components/organization-management/api-auth-modal/api-auth-modal.component.ts index d0465454..c572ee48 100644 --- a/src/app/routes/sys-setting/components/organization-management/api-auth-modal/api-auth-modal.component.ts +++ b/src/app/routes/sys-setting/components/organization-management/api-auth-modal/api-auth-modal.component.ts @@ -70,12 +70,10 @@ export class ApiAuthModalComponent implements OnInit { Object.assign(params, { enterpriseId: 0, enterpriseProjectId: 0 }); } this.loadingInfo = true; - this.service.request(this.params.updateUrl, params).subscribe( - res => { - if (res) { - this.service.msgSrv.success('编辑成功'); - this.modal.close(true); - } + this.service.request(this.params.updateUrl, params).subscribe(res => { + if (res) { + this.service.msgSrv.success('编辑成功'); + this.modal.close(true);} this.loadingInfo = false; }, _ => (this.loadingInfo = false), diff --git a/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.html b/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.html index 1c6a27b8..46207bfb 100644 --- a/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.html +++ b/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.html @@ -1,7 +1,7 @@
-
@@ -9,12 +9,12 @@
-
- +
diff --git a/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.ts b/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.ts index 51bc986d..cdc802f7 100644 --- a/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.ts +++ b/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core'; import { EAEnvironmentService } from '@shared'; -import { NzTreeComponent } from 'ng-zorro-antd/tree'; +import { NzFormatEmitEvent, NzTreeComponent, NzTreeNode } from 'ng-zorro-antd/tree'; import { SystemService } from '../../../services/system.service'; @Component({ @@ -11,14 +11,9 @@ import { SystemService } from '../../../services/system.service'; export class MenuTreeComponent implements OnInit, OnChanges { @ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent; origin: any = { buttonInfoList: [], dictList: [] }; - node: any = {}; + node!: NzTreeNode; authority: any[] = []; - defaultSelectedKeys: any[] = []; - defaultExpandedKeys: any[] = []; - defaultCheckedKeys: any[] = []; functionList: any[] = []; - allChecked = false; - indeterminate = true; @Input() type = 'edit'; @Input() source = ''; @Input() appId = this.envSrv.env.appId; @@ -26,11 +21,20 @@ export class MenuTreeComponent implements OnInit, OnChanges { @Input() authorityAssistId: any[] = []; @Input() roleId: any; @Output() changeData = new EventEmitter(); + + _apiAuthSet = new Set(); + _NodeAuthMap = new Map(); constructor(public service: SystemService, private cdr: ChangeDetectorRef, private envSrv: EAEnvironmentService) {} ngOnChanges(changes: SimpleChanges): void { if (changes.isAuthorityIdDTOList) { if (this.type === 'edit') { this.authority = this.isAuthorityIdDTOList || []; + this.authority.forEach(auth => { + this._NodeAuthMap.set(auth.authorityId, auth); + if (auth.buttonAuthorityIds) { + auth.buttonAuthorityIds.forEach((buttonId: string) => this._apiAuthSet.add(buttonId)); + } + }); } } } @@ -38,239 +42,183 @@ export class MenuTreeComponent implements OnInit, OnChanges { ngOnInit() { this.getAllFunction(); } + getAllFunction() { this.service .request(this.service.$api_getAllFunctionInfoByAppId, { appId: this.appId || this.envSrv.env.appId }, 'POST', true, 'FORM') .subscribe(res => { this.functionList = res; + // 重赋值选中权限 this.authorityAssistId = [...this.authorityAssistId]; this.cdr.detectChanges(); }); } - - addAuthority(origin: { id: any; all: any }, node: { buttonInfoList: any[] }, item?: { checked: any; functionButtonId: any }) { - console.log(origin, node); - if (this.authority?.length && this.authority.filter(authItem => authItem.authorityId === origin.id).length) { - // 判断此菜单权限是否已经存在权限列表中 - // 当前操作菜单id存在权限列表里 - this.authority.forEach(menuItem => { - console.log(menuItem); - console.log(item); - - if (menuItem.authorityId === origin.id) { - menuItem.buttonAuthorityIds = menuItem.buttonAuthorityIds || []; // 防止属性不存在,给属性指定数据类型 - if (item) { - // 单选 - if (item.checked) { - if (menuItem.buttonAuthorityIds.indexOf(item.functionButtonId) === -1) { - // 如果该按钮在数据权限数组中不存在 - menuItem.buttonAuthorityIds.push(item.functionButtonId); - } - } else { - if (menuItem.buttonAuthorityIds && menuItem.buttonAuthorityIds.length) { - menuItem.buttonAuthorityIds.forEach((btnItem: any, index: any) => { - if (btnItem === item.functionButtonId) { - menuItem.buttonAuthorityIds.splice(index, 1); - } - }); - } - } - } else { - // 全选 - if (origin.all) { - node.buttonInfoList.forEach((nodeItem: { id: any; checked: boolean }) => { - if (menuItem.buttonAuthorityIds.indexOf(nodeItem.id) === -1) { - menuItem.buttonAuthorityIds.push(nodeItem.id); - nodeItem.checked = true; - } - }); - } else { - if (menuItem.buttonAuthorityIds && menuItem.buttonAuthorityIds.length) { - menuItem.buttonAuthorityIds = []; - node.buttonInfoList.forEach((nodeItem: { checked: boolean }) => { - nodeItem.checked = false; - }); - } - } - } - } - }); + addAuthority( + status: boolean, + origin: { buttonInfoList: any[]; [key: string]: any }, + node: NzTreeNode, + item: { checked: any; functionButtonId: string } + ) { + // 更新完整操作权限数据 + if (status) { + this._apiAuthSet.add(item.functionButtonId); } else { - // 数组为空的时候 - const buttonAuthorityIds = []; - if (item) { - // 全选 - buttonAuthorityIds.push(item.functionButtonId); - } else { - node.buttonInfoList.forEach((nodeItem: { id: any; checked: boolean; _isHalfChecked: boolean }) => { - if (origin.all) { - buttonAuthorityIds.push(nodeItem.id); - nodeItem.checked = true; - } - }); - } - const obj: any = { - authorityId: origin.id, - buttonAuthorityIds - }; - this.authority.push(obj); + this._apiAuthSet.delete(item.functionButtonId); } - this.checkTreeNode(node, origin); - } - addDict(item: { checked: any; itemId: any; itemKey: any }, dictItem: { dictId: any }, origin: { id: any }, node: any) { - if (this.authority.length) { - // 判断此菜单权限是否已经存在权限列表中 - if (this.authority.filter(authItem => authItem.authorityId === origin.id).length) { - // 当前操作菜单id存在权限列表里 - this.authority.forEach((menuItem, menuIndex) => { - if (menuItem.authorityId === origin.id) { - menuItem.dataAuthority = menuItem.dataAuthority || []; // 防止属性不存在,给属性指定数据类型 - if (item.checked) { - if (menuItem.dataAuthority.filter((ele: { dictItemId: any }) => ele.dictItemId === item.itemId).length === 0) { - // 如果该按钮在数据权限数组中不存在 - menuItem.dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId }); - } - } else { - if (menuItem.dataAuthority && menuItem.dataAuthority.length) { - menuItem.dataAuthority.forEach((btnItem: { dictItemId: any }, index: any) => { - if (btnItem.dictItemId === item.itemId) { - menuItem.dataAuthority.splice(index, 1); - } - }); - } - } - } - }); - } else { - // 当前操作菜单id不存在权限列表里 - const dataAuthority = []; - dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId }); - const obj: any = { - authorityId: origin.id, - dataAuthority - }; - this.authority.push(obj); + let isHasChecked = false; + const checkedButIds = []; // 当前操作权限中勾选的权限 + // 判断当前操作权限列表的全选状态 + for (let index = 0; index < origin.buttonInfoList.length; index++) { + const but = origin.buttonInfoList[index]; + if (this._apiAuthSet.has(but.functionButtonId)) { + isHasChecked = true; + checkedButIds.push(but.functionButtonId); } + } + + // 更新树节点选中状态 + if (checkedButIds?.length > 0) { + origin.checked = true; + // TODO 去重 + const auths = [...this.authorityAssistId]; + auths.push(origin.id); + const authsSet = new Set(auths); + this.authorityAssistId = [...Array.from(authsSet)]; + // 更新菜单权限数据源 + this._NodeAuthMap.set(origin.id, { authorityId: origin.id, buttonAuthorityIds: checkedButIds, isUpdateAuthority: 1 }); } else { - // 数组为空的时候 - const dataAuthority = []; - dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId }); - const obj: any = { - authorityId: origin.id, - dataAuthority - }; - this.authority.push(obj); + origin.checked = false; + this.authorityAssistId = this.authorityAssistId.filter(auth => auth !== origin.id); + this._NodeAuthMap.delete(origin.id); + this.recursionDeleteParantNode(node); } - this.checkTreeNode(node, origin); } - checkTreeNode(node: any, origin: { id: any }) { - const checkedNode: any = this.nzTreeComponent.getCheckedNodeList(); - const allCheckedArr: any[] = []; - this.overTree(checkedNode, allCheckedArr); - this.authority.forEach(authItem => { - if (authItem.authorityId === origin.id) { - if ( - (authItem.buttonAuthorityIds && authItem.buttonAuthorityIds.length) || - (authItem.dataAuthority && authItem.dataAuthority.length) - ) { - if (allCheckedArr.indexOf(node.key) === -1) { - allCheckedArr.push(node.key); - } - } else { - if (allCheckedArr.indexOf(node.key) !== -1) { - allCheckedArr.forEach((ele, index) => { - if (ele === origin.id) { - allCheckedArr.splice(index, 1); - } - }); - } - } - } - }); - this.defaultCheckedKeys = allCheckedArr; - } - - overTree(children: any[], a: any[]) { - children.forEach(item => { - a.push(item.key); - if (item.isLeaf) { - return; - } - if (item.children && item.children.length) { - this.overTree(item.children, a); - } - }); - } - - addDisabledTree(arr: any[]) { - arr.forEach((item: any) => { - item.disableCheckbox = true; - if (item.isLeaf) { - return; - } - if (item.children && item.children.length) { - this.addDisabledTree(item.children); - } - }); - } - addDisabledLeafTree(arr: any[]) { - arr.forEach((item: any) => { - if (item.isLeaf) { - return; - } - item.disableCheckbox = true; - if (item.children && item.children.length) { - this.addDisabledLeafTree(item.children); - } - }); - } - nzEvent(event: any): void { + /** + * 点击树节点事件 + * @param event + */ + clickTreeNodeAction(event: any): void { this.origin = event.node.origin; - this.node = event.node.origin; - if (!event.node.origin.isLeaf) { - event.node.isExpanded = !event.node.isExpanded; - } else { + this.node = event.node; + // 叶子节点获取操作权限, 非叶子节点则展开 + if (event.node.origin.isLeaf) { this.initButtonList(event.node.key, event.node.origin); - // this.initDictList(event.node.key, event.node.origin); + } else { + event.node.isExpanded = !event.node.isExpanded; + } + } + + // 勾选叶子节点菜单时同步处理按钮权限数据 + changeTreeCheckEvent(event: NzFormatEmitEvent | { eventName: string; node: NzTreeNode; keys: string[]; checkedKeys: NzTreeNode[] }) { + // 叶子节点 + if (event.node?.origin.isLeaf) { + // 如果当前操作权限列表为该树节点的,则直接勾选 + if (this.origin.id === event.node?.origin.id) { + this.updateDataSource(event.node?.isChecked!, this.origin.buttonInfoList, event.node?.origin, event.node); + } else { + this.service.request(this.service.$api_getFunctionButtonInfo, { id: event.node?.origin.id }).subscribe((res: any[]) => { + if (res) { + this.updateDataSource(event.node?.isChecked!, res, event.node?.origin, event.node!); + } + }); + } + } else { + if (event.node?.isChecked) { + this.recursionSetNodeAuth(event.node.origin); + } else { + this.recursionDeleteNodeAuth(event.node?.origin); + } + } + } + + private recursionSetNodeAuth(origin: any) { + this._NodeAuthMap.set(origin.id, { authorityId: origin.id, buttonAuthorityIds: [], isUpdateAuthority: 1 }); + let auths = [...this.authorityAssistId]; + origin.children?.forEach((node: any) => { + auths.push(node.id); + const _auth = this._NodeAuthMap.get(node.id); + this._NodeAuthMap.set(node.id, { + authorityId: node.id, + buttonAuthorityIds: _auth?.buttonAuthorityIds || [], + isUpdateAuthority: 1 + }); + if (node?.children?.length > 0) { + this.recursionSetNodeAuth(node); + } + }); + auths = [...auths, ...this.authorityAssistId]; + const authsSet = new Set(auths); + this.authorityAssistId = [...Array.from(authsSet)]; + } + + private recursionDeleteNodeAuth(origin: any) { + this._NodeAuthMap.delete(origin.id); + this.authorityAssistId = this.authorityAssistId.filter(auth => auth !== origin.id); + origin.children?.forEach((node: any) => { + this.authorityAssistId = this.authorityAssistId.filter(auth => auth !== node.id); + this._NodeAuthMap.delete(node.id); + if (node?.children?.length > 0) { + this.recursionDeleteNodeAuth(node); + } + }); + } + + /** + * 根据树勾选状态更新数据源 + * 1.更新操作权限点数据源 _apiAuthSet + * 2.更新菜单权限数据源 _NodeAuthMap + * + * @param isChecked + * @param data + */ + private updateDataSource(isChecked: boolean, data: any[], origin: any, node: NzTreeNode) { + if (isChecked) { + data.forEach(auth => this._apiAuthSet.add(auth.functionButtonId)); + const _auth = this._NodeAuthMap.get(origin.id); + this._NodeAuthMap.set(origin.id, { + authorityId: origin.id, + buttonAuthorityIds: _auth?.buttonAuthorityIds || [], + isUpdateAuthority: 1 + }); + const auths = [...this.authorityAssistId]; + auths.push(origin.id); + const authsSet = new Set(auths); + this.authorityAssistId = [...Array.from(authsSet)]; + } else { + data.forEach(auth => this._apiAuthSet.delete(auth.functionButtonId)); + this._NodeAuthMap.delete(origin.id); + this.authorityAssistId = this.authorityAssistId.filter(auth => auth !== origin.id); + this.recursionDeleteParantNode(node); + } + } + + private recursionDeleteParantNode(node: NzTreeNode) { + this.authorityAssistId = this.authorityAssistId.filter(auth => auth !== node.origin.id); + if (node.parentNode) { + this.recursionDeleteParantNode(node.parentNode); } } washTree() { - const authorityMenu: any[] = []; // this.authority - const tempAuthorityIdDTOListMenu: any[] = []; - const checkedNode: any = this.nzTreeComponent.getCheckedNodeList(); - const halfCheckedNode: any = this.nzTreeComponent.getHalfCheckedNodeList(); - this.authorityAssistId = []; - halfCheckedNode.forEach((item: { key: any }) => { - authorityMenu.push({ authorityId: item.key, isUpdateAuthority: 0 }); - tempAuthorityIdDTOListMenu.push(item.key); - }); - this.overWashTree(checkedNode, tempAuthorityIdDTOListMenu, authorityMenu); - if (this.authority && this.authority.length) { - this.authority.forEach(item => { - item.isUpdateAuthority = 1; - if (tempAuthorityIdDTOListMenu.indexOf(item.authorityId) !== -1) { - tempAuthorityIdDTOListMenu.forEach((oldItem, oldIndex) => { - if (oldItem === item.authorityId) { - authorityMenu[oldIndex] = item; - } - }); - } - }); - } + // const checkedNode: any = this.nzTreeComponent.getCheckedNodeList(); + // const halfCheckedNode: any = this.nzTreeComponent.getHalfCheckedNodeList(); + const authority: any[] = []; + this._NodeAuthMap.forEach(nodeAuth => authority.push(nodeAuth)); const result = { - authority: authorityMenu, + authority: authority, authorityAssistId: this.authorityAssistId }; + console.log(result); + this.changeData.emit(result); return result; } overWashTree(children: any[], tempAuthorityIdDTOListMenu: any[], authorityMenu: any[]) { children.forEach((item: any) => { - this.authorityAssistId.push(item.key); + // this.authorityAssistId.push(item.key); tempAuthorityIdDTOListMenu.push(item.key); authorityMenu.push({ authorityId: item.key, isUpdateAuthority: 1 }); if (item.isLeaf) { @@ -283,129 +231,12 @@ export class MenuTreeComponent implements OnInit, OnChanges { } initButtonList(id: any, origin: any) { - if (origin.expanded) { - origin.children.forEach((item: any, index: number) => { - if (item.selected) { - if (origin.checked) { - this.authority.splice(index, 1); - const buttonAuthorityIds: any = []; - item.buttonInfoList.forEach((btnItem: any) => { - btnItem.checked = true; - buttonAuthorityIds.push(btnItem.functionButtonId); - }); - this.authority.push({ authorityId: origin.key, buttonAuthorityIds, isUpdateAuthority: 1 }); - } else { - this.authority.splice(index, 1); - item.buttonInfoList.forEach((btnItem: any) => { - btnItem.checked = false; - }); - } - } - }); - } - const params = { - id - }; - this.service.request(this.service.$api_getFunctionButtonInfo, params).subscribe(res => { + this.service.request(this.service.$api_getFunctionButtonInfo, { id }).subscribe((res: any[]) => { if (res) { origin.buttonInfoList = res; origin.all = false; - console.log(origin); - - // 判断此菜单下是否已有此按钮权限 - this.againGetBtn(id, origin); - } - }); - } - // 再次请求,需要判断暂存权限数组是否已有此权限 - againGetBtn(id: any, origin: any) { - if (this.authority && this.authority.length === 0) { - const buttonAuthorityIds: any = []; - if (origin.checked) { - origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => { - btnItem.checked = true; - buttonAuthorityIds.push(btnItem.functionButtonId); - }); - this.authority.push({ authorityId: origin.key, buttonAuthorityIds, isUpdateAuthority: 1 }); - } - } else { - if (origin.checked) { - //菜单勾选情况下 - if (this.authority.some(item => item.authorityId === id)) { - this.authority.forEach(item => { - if (item.authorityId === id) { - // 如果当前菜单Id存在权限列表里,并且等于暂存权限数组的Id - if (item.buttonAuthorityIds && item.buttonAuthorityIds.length) { - // 如果当前菜单Id权限数组不为空 - origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => { - // 判断已有权限id是否存在 - if (item.buttonAuthorityIds.indexOf(btnItem.functionButtonId) !== -1) { - btnItem.checked = true; - } else { - btnItem.checked = false; - } - }); - } - } - }); - } else { - this.authority.push({ authorityId: origin.key, buttonAuthorityIds: [], isUpdateAuthority: 1 }); - this.authority.forEach(item => { - origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => { - btnItem.checked = true; - item.buttonAuthorityIds.push(btnItem.functionButtonId); - }); - }); - } - } else { - // 菜单未勾选,要删除权限 - this.authority.forEach((item, index) => { - if (item.authorityId === id) { - // 如果当前菜单Id存在权限列表里,并且等于暂存权限数组的Id - this.authority.splice(index, 1); - origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => { - btnItem.checked = false; - }); - } - }); - } - } - } - - initDictList(id: any, origin: any) { - const params = { - id - }; - this.service.request(this.service.$api_getFunctionDataInfo, params).subscribe(res => { - if (res) { - origin.dictList = res; - // 判断此菜单下是否已有此按钮权限 - this.againGetDict(id, origin); - } - }); - } - // 再次请求,需要判断暂存权限数组是否已有此权限 - againGetDict(id: any, origin: any) { - if (this.authority.length === 0) { - return; - } - this.authority.forEach(item => { - if (item.authorityId === id) { - // 如果当前菜单Id等于暂存权限数组的Id - if (item.dataAuthority && item.dataAuthority.length) { - // 如果当前菜单Id权限数组不为空 - origin.dictList.forEach((ele: { dictItem: any[] }) => { - // 判断已有权限id是否存在 - ele.dictItem.forEach((dictItem: { itemId: any; checked: boolean; cheked: boolean }) => { - item.dataAuthority.forEach((dataItem: { dictItemId: any }) => { - if (dataItem.dictItemId === dictItem.itemId) { - dictItem.checked = true; - } else { - dictItem.cheked = false; - } - }); - }); - }); + if (origin.checked) { + res.forEach(auth => this._apiAuthSet.add(auth.functionButtonId)); } } });