From 5a704146a552d69ed3eebf65009af4e0e5abe3ee Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 16 Dec 2024 11:07:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=92=E8=89=B2=E5=88=86=E9=85=8D?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=8B=BE=E9=80=89=E7=88=B6=E5=AD=90=E7=BA=A7?= =?UTF-8?q?=E8=81=94=E8=BD=AC=E5=87=BA=E5=AD=90=E8=8A=82=E7=82=B9=E5=85=B3?= =?UTF-8?q?=E8=81=94=E6=A0=B9=E8=8A=82=E7=82=B9=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/parse-tree-utils.ts | 44 +++++++++++++++++++++++++++++++-- src/views/system/role/index.vue | 27 +++++++++++++++++--- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/src/utils/parse-tree-utils.ts b/src/utils/parse-tree-utils.ts index 0698054c..0791f050 100644 --- a/src/utils/parse-tree-utils.ts +++ b/src/utils/parse-tree-utils.ts @@ -126,7 +126,7 @@ export function parseDataToTreeExclude( } /** - * 解析树结构数据转出一维id数组 + * 解析树结构数据转出所有一维id数组 * * @param data 数组数据 * @param fieldId 读取节点字段 默认 'id' @@ -158,7 +158,7 @@ export function parseTreeKeys( } /** - * 解析树结构数据转出含子节点的一维id数组 + * 解析树结构数据转出根节点的一维id数组 * * @param data 数组数据 * @param fieldId 读取节点字段 默认 'id' @@ -221,3 +221,43 @@ export function parseDataToOptions( return options; } + +/** + * 解析树结构数据转出子节点关联根节点的一维id数组 + * + * @param data 数组数据 + * @param checkedKeys 子节点数组数据 + * @param fieldId 读取节点字段 默认 'id' + * @param fieldChildren 读取子节点字段 默认 'children' + * @returns 层级数组 + */ +export function parseTreeNodeKeysByChecked( + data: Record[], + checkedKeys: (string | number)[], + fieldId: string = 'id', + fieldChildren: string = 'children' +) { + // 节点id + let treeIds: (string | number)[] = []; + componet(data); + /**闭包递归函数 */ + function componet(data: Record[]) { + if (data.length <= 0) return false; + let hasKey = false; + for (const iterator of data) { + const key = iterator[fieldId]; + if (checkedKeys.includes(key)) { + hasKey = true; + } + let nodes = iterator[fieldChildren]; + if (Array.isArray(nodes) && nodes.length > 0) { + if (componet(nodes)) { + treeIds.push(key); + hasKey = true; + } + } + } + return hasKey; + } + return treeIds; +} diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index 8faa1cc2..3f14810f 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -23,7 +23,11 @@ import { saveAs } from 'file-saver'; import { parseDateToStr } from '@/utils/date-utils'; import useDictStore from '@/store/modules/dict'; import { DataNode } from 'ant-design-vue/es/tree'; -import { parseTreeKeys, parseTreeNodeKeys } from '@/utils/parse-tree-utils'; +import { + parseTreeKeys, + parseTreeNodeKeys, + parseTreeNodeKeysByChecked, +} from '@/utils/parse-tree-utils'; import { hasPermissions } from '@/plugins/auth-user'; import { MENU_PATH_INLINE } from '@/constants/menu-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; @@ -328,7 +332,12 @@ function fnModalVisibleByVive(roleId: string | number) { menuTree.treeData = menus; modalState.menuTree.treeData = menus; modalState.menuTree.checkedKeys = checkedKeys; - modalState.from.menuIds = checkedKeys; + if (modalState.from.menuCheckStrictly === '1') { + const ids = parseTreeNodeKeysByChecked(menus, checkedKeys, 'id'); + modalState.from.menuIds = ids.concat(checkedKeys); + } else { + modalState.from.menuIds = checkedKeys; + } } modalState.title = t('views.system.role.roleInfo'); modalState.openByView = true; @@ -385,7 +394,12 @@ function fnModalVisibleByEdit(roleId?: string | number) { menuTree.treeData = menus; modalState.menuTree.treeData = menus; modalState.menuTree.checkedKeys = checkedKeys; - modalState.from.menuIds = checkedKeys; + if (modalState.from.menuCheckStrictly === '1') { + const ids = parseTreeNodeKeysByChecked(menus, checkedKeys, 'id'); + modalState.from.menuIds = ids.concat(checkedKeys); + } else { + modalState.from.menuIds = checkedKeys; + } } modalState.title = t('common.editText') + t('views.system.role.roleInfo'); @@ -567,7 +581,12 @@ function fnRecordDataScope(roleId: string | number) { deptTree.treeData = depts; modalState.deptTree.treeData = depts; modalState.deptTree.checkedKeys = checkedKeys; - modalState.from.deptIds = checkedKeys; + if (modalState.from.deptCheckStrictly === '1') { + const ids = parseTreeNodeKeysByChecked(depts, checkedKeys, 'id'); + modalState.from.deptIds = ids.concat(checkedKeys); + } else { + modalState.from.deptIds = checkedKeys; + } } modalState.title = t('views.system.role.distribute'); modalState.openByDataScope = true;