|
|
@@ -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) {
|