diff --git a/src/app/routes/sys-setting/components/organization-management/api-auth-modal/api-auth-modal.component.html b/src/app/routes/sys-setting/components/organization-management/api-auth-modal/api-auth-modal.component.html
index 1ac66921..b92286ac 100644
--- a/src/app/routes/sys-setting/components/organization-management/api-auth-modal/api-auth-modal.component.html
+++ b/src/app/routes/sys-setting/components/organization-management/api-auth-modal/api-auth-modal.component.html
@@ -1,10 +1,10 @@
-
-
+
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
new file mode 100644
index 00000000..1c6a27b8
--- /dev/null
+++ b/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.less b/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.less
new file mode 100644
index 00000000..43eaee62
--- /dev/null
+++ b/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.less
@@ -0,0 +1,211 @@
+:host {
+ .toolbar-btn {
+ padding-left: 0;
+ }
+
+ ::ng-deep {
+ .ant-checkbox-wrapper+.ant-checkbox-wrapper {
+ margin: 0;
+ }
+
+ .listDiv {
+ cdk-virtual-scroll-viewport {
+ border: 1px solid rgba(242, 242, 240, 1);
+ }
+
+ .selectedItem {
+ background: #e6f7ff;
+
+ span {
+ a {
+ color: rgba(212, 72, 86, 1);
+ }
+ }
+
+ ul>li>a>i {
+ color: rgba(212, 72, 86, 1);
+ }
+ }
+
+ .listBottom {
+ height : 2.5rem;
+ overflow : hidden;
+ text-align : center;
+ background-color: rgba(245, 245, 245, 0.7);
+
+ &:hover {
+ background-color: rgba(245, 245, 245, 1);
+ transition : all 1s;
+ }
+ }
+ }
+
+ .ant-tabs-nav {
+ width : 100%;
+ margin: 0 !important;
+ }
+
+ .buttons {
+ padding: 0;
+
+ button {
+ display : block;
+ max-width: 10rem;
+ margin : 0.3rem 0.5rem 0 0;
+ }
+
+ .ant-btn+.ant-btn:not(.ant-btn-link),
+ .ant-btn+nz-popconfirm,
+ nz-popconfirm+.ant-btn,
+ nz-popconfirm+nz-popconfirm,
+ .ant-btn+nz-button-group,
+ nz-button-group+.ant-btn,
+ .ant-btn+nz-dropdown,
+ nz-dropdown+.ant-btn,
+ nz-popconfirm+nz-button-group,
+ nz-button-group+nz-popconfirm {
+ margin-left: 0;
+ }
+ }
+
+ .ant-tabs-bar {
+ margin: 0;
+ }
+
+ // .ant-tree-node-selected {
+ // background: none !important;
+ // }
+ // .ant-tree-node-content-wrapper:hover {
+ // background: none;
+ // }
+ .ant-tree-node-content-wrapper {
+ width: 100%;
+ }
+
+ .ant-tabs .ant-tabs-tabpane {
+ padding : 10px 10px 2px 10px;
+ background : #fdfdfd;
+ border-right : solid 1px #eee;
+ border-bottom: solid 1px #eee;
+ border-left : solid 1px #eee;
+ }
+
+ // .ant-tabs-tab {
+ // width: 50%;
+ // text-align: center;
+ // }
+ // .ant-tabs-tab-arrow-show {
+ // display: none;
+ // }
+ ul {
+ margin : 0;
+ padding: 0;
+ }
+ }
+}
+
+.firstStepBox {
+ width : 100%;
+ line-height: 50px;
+ text-align : center;
+ background : #f7f7f7;
+}
+
+.itemBox {
+ width : 100%;
+ height : 50px;
+ padding : 0 0 0 60px;
+ color : #5f5f5f;
+ line-height: 50px;
+ cursor : pointer;
+
+ &:hover {
+ background: #e6f7ff;
+ }
+}
+
+.twoStepBox {
+ width : 100%;
+ line-height: 50px;
+ text-align : center;
+ background : #f7f7f7;
+
+ span {
+ display: inline-block;
+ margin : 0 auto;
+ }
+
+ >i {
+ float : right;
+ margin: 20px 20px 0 0;
+ }
+
+ button {
+ float : right;
+ margin: 8px 20px 0 0;
+ }
+
+ .blueFont {
+ color: #1890ff;
+ }
+}
+
+.folder-desc i {
+ margin: 0 5px;
+}
+
+.flexBox {
+ .titleBox {
+ display : flex;
+ justify-content: space-between;
+
+ i {
+ margin: 0 8px;
+ }
+ }
+}
+
+ul {
+ display: block;
+}
+
+li {
+ line-height: 30px;
+ list-style : none;
+}
+
+.dictData {
+ dl {
+ margin : 0;
+ padding: 0;
+ }
+
+ dt {
+ margin : 0 0 5px 0;
+ padding : 3px 0;
+ color : #999;
+ font-weight : normal;
+ font-size : 13px;
+ border-bottom: solid 1px #eee;
+ }
+}
+
+label {
+ color : #666;
+ font-size: 13px;
+}
+
+.treeWrap {
+ display: flex;
+ width : 700px;
+
+ .leftBox {
+ width : 40%;
+ // border-right: solid 1px #eee;
+ }
+
+ .rightBox {
+ width : 60%;
+ padding: 0 0 0 20px;
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 00000000..51bc986d
--- /dev/null
+++ b/src/app/routes/sys-setting/components/organization-management/menu-tree/menu-tree.component.ts
@@ -0,0 +1,413 @@
+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 { SystemService } from '../../../services/system.service';
+
+@Component({
+ selector: 'app-menu-tree',
+ templateUrl: './menu-tree.component.html',
+ styleUrls: ['./menu-tree.component.less']
+})
+export class MenuTreeComponent implements OnInit, OnChanges {
+ @ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent;
+ origin: any = { buttonInfoList: [], dictList: [] };
+ node: any = {};
+ 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;
+ @Input() isAuthorityIdDTOList: any[] = [];
+ @Input() authorityAssistId: any[] = [];
+ @Input() roleId: any;
+ @Output() changeData = new EventEmitter();
+ 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 || [];
+ }
+ }
+ }
+
+ 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;
+ });
+ }
+ }
+ }
+ }
+ });
+ } 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.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);
+ }
+ } 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);
+ }
+ 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 {
+ this.origin = event.node.origin;
+ this.node = event.node.origin;
+ if (!event.node.origin.isLeaf) {
+ event.node.isExpanded = !event.node.isExpanded;
+ } else {
+ this.initButtonList(event.node.key, event.node.origin);
+ // this.initDictList(event.node.key, event.node.origin);
+ }
+ }
+
+ 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 result = {
+ authority: authorityMenu,
+ authorityAssistId: this.authorityAssistId
+ };
+ this.changeData.emit(result);
+ return result;
+ }
+ overWashTree(children: any[], tempAuthorityIdDTOListMenu: any[], authorityMenu: any[]) {
+ children.forEach((item: any) => {
+ this.authorityAssistId.push(item.key);
+ tempAuthorityIdDTOListMenu.push(item.key);
+ authorityMenu.push({ authorityId: item.key, isUpdateAuthority: 1 });
+ if (item.isLeaf) {
+ return;
+ }
+ if (item.children) {
+ this.overWashTree(item.children, tempAuthorityIdDTOListMenu, authorityMenu);
+ }
+ });
+ }
+
+ 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 => {
+ 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;
+ }
+ });
+ });
+ });
+ }
+ }
+ });
+ }
+}
diff --git a/src/app/routes/sys-setting/sys-setting.module.ts b/src/app/routes/sys-setting/sys-setting.module.ts
index c7462e40..9e85ab05 100644
--- a/src/app/routes/sys-setting/sys-setting.module.ts
+++ b/src/app/routes/sys-setting/sys-setting.module.ts
@@ -37,6 +37,7 @@ import { SmsTemplateComponent } from './components/sms-template/sms-template.com
import { OrganizationManagementComponent } from './components/organization-management/organization-management.component';
import { OrganizationModalComponent } from './components/organization-management/organization-modal/organization-modal.component';
import { ApiAuthModalComponent } from './components/organization-management/api-auth-modal/api-auth-modal.component';
+import { MenuTreeComponent } from './components/organization-management/menu-tree/menu-tree.component';
const COMPONENTS = [
StaffManagementComponent,
@@ -66,10 +67,12 @@ const NOTROUTECOMPONENTS = [
CartConfigActionModalComponent,
SettingRoleEditComponent,
SettingMenuComponent,
- OrganizationModalComponent
+ OrganizationModalComponent,
+ ApiAuthModalComponent,
+ MenuTreeComponent
];
@NgModule({
- declarations: [...COMPONENTS, ...NOTROUTECOMPONENTS, ApiAuthModalComponent],
+ declarations: [...COMPONENTS, ...NOTROUTECOMPONENTS],
imports: [CommonModule, SysSettingRoutingModule, SharedModule, DynamicSettingModule]
})
export class SysSettingModule {}
diff --git a/src/app/routes/usercenter/components/freight/list/list.component.html b/src/app/routes/usercenter/components/freight/list/list.component.html
index 0adfbf1d..f62797c1 100644
--- a/src/app/routes/usercenter/components/freight/list/list.component.html
+++ b/src/app/routes/usercenter/components/freight/list/list.component.html
@@ -1,5 +1,5 @@
@@ -58,11 +58,13 @@
{{ item.contacter }}
/{{item.mobile}}
- {{ item.partnerName }}
/{{item.promotersTelephone}}
+ {{ item.partnerName }}
/{{item.partnerMobile}}
- {{ item.promotersTelephone
- || '添加' }}
+
+ {{ item.channelName }}
{{ item.channelMobile }}
@@ -78,7 +80,9 @@
-
-
+
+
-
\ No newline at end of file
+