lxr 2 сар өмнө
parent
commit
01ce67050d

+ 63 - 0
src/views/accountRoleManagement/roleManagement/create.vue

@@ -148,6 +148,7 @@ const saveLoading = ref(false);
 
 // 标志位:防止自动勾选"查看"权限时触发递归
 const isAutoCheckingView = ref(false);
+const isAutoUncheckingParent = ref(false);
 
 // 控制父子节点是否严格独立(false表示父子关联,true表示严格独立)
 // 设置为true,使父子节点独立,选择某一级时不会自动勾选下级
@@ -423,6 +424,14 @@ const handlePermissionCheck = (data: any, checked: any) => {
     roleFormRef.value?.validateField("permissions");
     return;
   }
+  // 如果正在自动取消勾选父级,仅同步状态后返回
+  if (isAutoUncheckingParent.value) {
+    const checkedKeys = permissionTreeRef.value?.getCheckedKeys() || [];
+    roleForm.permissions = checkedKeys;
+    updateNodeDisabledState(permissionTreeData.value, checkedKeys);
+    roleFormRef.value?.validateField("permissions");
+    return;
+  }
 
   // 获取当前选中的 keys
   const checkedKeys = permissionTreeRef.value?.getCheckedKeys() || [];
@@ -436,6 +445,21 @@ const handlePermissionCheck = (data: any, checked: any) => {
   // 通过 el-tree 的 getNode 方法获取节点对象
   const currentNode = permissionTreeRef.value?.getNode(data.id);
 
+  // 有子级的父节点:若子级均未选中,则不允许单独勾选父级;仅一级无子级可自由勾选
+  if (isChecked && !isLeafNode && currentNode) {
+    const hasChildChecked = hasCheckedChildrenInData(data, checkedKeys);
+    if (!hasChildChecked) {
+      nextTick(() => {
+        permissionTreeRef.value?.setChecked(data.id, false, false);
+        const updatedCheckedKeys = permissionTreeRef.value?.getCheckedKeys() || [];
+        roleForm.permissions = updatedCheckedKeys;
+        updateNodeDisabledState(permissionTreeData.value, updatedCheckedKeys);
+        ElMessage.warning("子级均未选中时,父级不能单独勾选,请先勾选至少一个子级权限");
+      });
+      return;
+    }
+  }
+
   // 如果尝试取消勾选"查看"权限
   if (isLeafNode && data.label === "查看" && !isChecked && currentNode) {
     // 检查同级是否有其他非"查看"权限被勾选
@@ -503,6 +527,45 @@ const handlePermissionCheck = (data: any, checked: any) => {
     }
   }
 
+  // 取消勾选子级时:若某层父级已无任一子级被勾选,则自动取消该父级勾选
+  if (!isChecked && isLeafNode && currentNode?.parent) {
+    const keys = new Set<number>(permissionTreeRef.value?.getCheckedKeys() || []);
+    const toUncheck: number[] = [];
+    let p: any = currentNode.parent;
+    while (p?.data) {
+      const pid = p.data.id;
+      if (!keys.has(pid)) {
+        p = p.parent;
+        continue;
+      }
+      if (!p.data.children?.length) {
+        p = p.parent;
+        continue;
+      }
+      if (hasCheckedChildrenInData(p.data, [...keys])) {
+        p = p.parent;
+        continue;
+      }
+      toUncheck.push(pid);
+      keys.delete(pid);
+      p = p.parent;
+    }
+    if (toUncheck.length) {
+      isAutoUncheckingParent.value = true;
+      nextTick(() => {
+        toUncheck.forEach(id => permissionTreeRef.value?.setChecked(id, false, false));
+        const updated = permissionTreeRef.value?.getCheckedKeys() || [];
+        roleForm.permissions = updated;
+        updateNodeDisabledState(permissionTreeData.value, updated);
+        nextTick(() => {
+          isAutoUncheckingParent.value = false;
+        });
+      });
+      roleFormRef.value?.validateField("permissions");
+      return;
+    }
+  }
+
   // 如果勾选的是三级权限(叶子节点),自动勾选同级的"查看"权限
   if (isChecked && isLeafNode && data.label !== "查看" && currentNode) {
     if (currentNode.parent) {