From 07a27fa13dbc701a7a1341ae0ad90dd6572315b0 Mon Sep 17 00:00:00 2001 From: dzq Date: Sat, 21 Jun 2025 08:16:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E8=A7=92=E8=89=B2=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=80=BB=E8=BE=91=E5=B9=B6=E7=A7=BB=E9=99=A4=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 updateDataScope 函数的数据权限更新逻辑,增加 updateAll 参数控制更新范围 优化菜单选择变化时的数据权限处理,增加读写权限的自动管理 移除所有调试用的 console.log 语句 --- src/views/system/role/index.vue | 55 +++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index 5eb6f11..110c736 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -81,7 +81,7 @@ const rules: FormRules = { }; watch(activeTab, async (val) => { - console.log("activeTab", val); // 输出当前选中的标签的 key 或其他标识符 + // console.log("activeTab", val); // 输出当前选中的标签的 key 或其他标识符 opRow.value = dataList.value.find(item => item.roleKey == val); if (!opRow.value) { return; @@ -89,7 +89,7 @@ watch(activeTab, async (val) => { await getRoleInfo("update", opRow.value); Object.assign(formData, opRow.value); formData.menuIds = opRow.value.selectedMenuList; - updateDataScope(); + updateDataScope(true); }); async function getRoleInfo(type: "add" | "update", row?: RoleDTO) { try { @@ -149,23 +149,47 @@ watch(menuTree, (val) => { }; // 遍历菜单树,开始收集菜单项 - console.log("遍历菜单树 val", val); + // console.log("遍历菜单树 val", val); val.forEach(menuOption => { collectMenus(menuOption); }) - console.log("categories", categories); // 输出处理后的菜单选项结构,方便调试和查看结构 + // console.log("categories", categories); // 输出处理后的菜单选项结构,方便调试和查看结构 // 更新处理后的菜单选项 processedMenuOptions.value = categories; }); // 监听菜单选择变化,更新数据权限 -const updateDataScope = () => { - dataScope.value = {}; +const updateDataScope = (updateAll: boolean) => { + if (updateAll) { + dataScope.value = {}; + } + // console.log("updateDataScope formData.menuIds", formData.menuIds); processedMenuOptions.value.forEach(category => { - const selectedItem = category.items.find(item => item.menuName == '读写' && formData.menuIds.includes(item.id)); - const permission = selectedItem ? '1' : '0'; - dataScope.value[category.id] = `${category.id}-${permission}`; + // 检查是否有任何非“读写”的菜单权限被选中 + const hasSelectedMenu = category.items.some(item => + item.menuName !== '读写' && formData.menuIds.includes(item.id) + ); + // 检查是否有任何“读写”的菜单权限被选中 + const hasWriteSelectedMenu = category.items.some(item => + item.menuName == '读写' && formData.menuIds.includes(item.id) + ); + + if (hasSelectedMenu && !hasWriteSelectedMenu) { + // 有选中的菜单权限,默认选中只读 + dataScope.value[category.id] = dataScope.value[category.id] || `${category.id}-0`; + } else if (hasSelectedMenu && hasWriteSelectedMenu) { + // 有选中的“读写”菜单权限,默认选中“读写” + dataScope.value[category.id] = dataScope.value[category.id] || `${category.id}-1`; + } else { + // 没有选中的菜单权限,不选中任何数据权限 + dataScope.value[category.id] = null; + + if (hasWriteSelectedMenu) { + const writeReadItem = category.items.find(item => item.menuName === '读写'); + formData.menuIds = formData.menuIds.filter(id => id !== writeReadItem.id); + } + } }); }; @@ -174,6 +198,9 @@ watch( dataScope, (newDataScope) => { Object.entries(newDataScope).forEach(([categoryId, scopeValue]) => { + if (!scopeValue) { + return; + } const [id, permission] = scopeValue.split('-'); const category = processedMenuOptions.value.find(cat => cat.id === Number(id)); if (!category) return; @@ -193,12 +220,20 @@ watch( { deep: true } ); +// 监听菜单选择变化,更新数据权限 +watch(() => formData.menuIds, + () => { + updateDataScope(false); + }, + { deep: true } +); + async function handleConfirm() { try { await formRef.value?.validate(); loading.value = true; formData.dataScope = Object.values(dataScope.value).join(','); - console.log("opType", opType.value); + // console.log("opType", opType.value); if (opType.value === 'add') { await addRoleApi(formData as AddRoleCommand); } else {