Commit 6860bef5dd9c5abc0d2bd191dfb1ab74cb75ca8c
1 parent
ad0b74c2
fix: role manange not save half checked menu keys
Showing
3 changed files
with
46 additions
and
16 deletions
| @@ -66,8 +66,6 @@ | @@ -66,8 +66,6 @@ | ||
| 66 | showActionButtonGroup: false, | 66 | showActionButtonGroup: false, |
| 67 | }); | 67 | }); |
| 68 | 68 | ||
| 69 | - const originMenus = ref(); | ||
| 70 | - | ||
| 71 | const transformName = (data: TreeData[]) => { | 69 | const transformName = (data: TreeData[]) => { |
| 72 | return data.map((item) => { | 70 | return data.map((item) => { |
| 73 | item.name = t(item.name); | 71 | item.name = t(item.name); |
| @@ -81,8 +79,6 @@ | @@ -81,8 +79,6 @@ | ||
| 81 | const userStore = useUserStore(); | 79 | const userStore = useUserStore(); |
| 82 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | 80 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
| 83 | allCheckedKeys.value = []; | 81 | allCheckedKeys.value = []; |
| 84 | - originMenus.value = []; | ||
| 85 | - allCheckedKeys.value.length = 0; | ||
| 86 | resetFields(); | 82 | resetFields(); |
| 87 | roleId.value = ''; | 83 | roleId.value = ''; |
| 88 | // 在打开弹窗时清除所有选择的菜单 | 84 | // 在打开弹窗时清除所有选择的菜单 |
| @@ -110,13 +106,12 @@ | @@ -110,13 +106,12 @@ | ||
| 110 | 106 | ||
| 111 | // 更新 | 107 | // 更新 |
| 112 | if (unref(isUpdate)) { | 108 | if (unref(isUpdate)) { |
| 113 | - allCheckedKeys.value = []; | ||
| 114 | checked.value = []; | 109 | checked.value = []; |
| 115 | roleId.value = data.record.id; | 110 | roleId.value = data.record.id; |
| 116 | 111 | ||
| 117 | //通过角色id去获取角色对应的菜单的ids | 112 | //通过角色id去获取角色对应的菜单的ids |
| 118 | - originMenus.value = roleMenus.value = await getMenusIdsByRoleId(data.record.id); | ||
| 119 | - | 113 | + allCheckedKeys.value = roleMenus.value = await getMenusIdsByRoleId(data.record.id); |
| 114 | + excludeHalfCheckedKeys(unref(treeData)); | ||
| 120 | await nextTick(); | 115 | await nextTick(); |
| 121 | treeRef.value.setCheckedKeys(roleMenus.value); | 116 | treeRef.value.setCheckedKeys(roleMenus.value); |
| 122 | setFieldsValue(data.record); | 117 | setFieldsValue(data.record); |
| @@ -141,7 +136,7 @@ | @@ -141,7 +136,7 @@ | ||
| 141 | name: values.name, | 136 | name: values.name, |
| 142 | remark: values.remark, | 137 | remark: values.remark, |
| 143 | status: values.status, | 138 | status: values.status, |
| 144 | - menu: unref(treeRef).getCheckedKeys() || [], | 139 | + menu: unref(allCheckedKeys) || [], |
| 145 | }; | 140 | }; |
| 146 | if (req.menu == undefined) return createMessage.error('请勾选权限菜单'); | 141 | if (req.menu == undefined) return createMessage.error('请勾选权限菜单'); |
| 147 | saveOrUpdateRoleInfoWithMenu(req).then(() => { | 142 | saveOrUpdateRoleInfoWithMenu(req).then(() => { |
| @@ -226,6 +221,25 @@ | @@ -226,6 +221,25 @@ | ||
| 226 | return result; | 221 | return result; |
| 227 | }; | 222 | }; |
| 228 | 223 | ||
| 224 | + const excludeHalfCheckedKeys = (treeData: MenuRecord[]) => { | ||
| 225 | + const needExcludeKeys: string[] = []; | ||
| 226 | + const query = (data: MenuRecord[]) => { | ||
| 227 | + data.forEach((item) => { | ||
| 228 | + item.checked = roleMenus.value.includes(item.id); | ||
| 229 | + if (item.children && item.children.length) { | ||
| 230 | + query(item.children); | ||
| 231 | + item.checked = item.children.every((item) => item.checked); | ||
| 232 | + } | ||
| 233 | + if (!item.checked) { | ||
| 234 | + needExcludeKeys.push(item.id); | ||
| 235 | + } | ||
| 236 | + }); | ||
| 237 | + }; | ||
| 238 | + query(treeData); | ||
| 239 | + roleMenus.value = unref(roleMenus).filter((key) => !needExcludeKeys.includes(key)); | ||
| 240 | + return needExcludeKeys; | ||
| 241 | + }; | ||
| 242 | + | ||
| 229 | return { | 243 | return { |
| 230 | spinning, | 244 | spinning, |
| 231 | registerDrawer, | 245 | registerDrawer, |
| @@ -52,7 +52,7 @@ | @@ -52,7 +52,7 @@ | ||
| 52 | emits: ['success', 'register'], | 52 | emits: ['success', 'register'], |
| 53 | setup(_, { emit }) { | 53 | setup(_, { emit }) { |
| 54 | const isUpdate = ref(true); | 54 | const isUpdate = ref(true); |
| 55 | - const treeData = ref<TreeItem[]>([]); | 55 | + const treeData = ref<TreeData[]>([]); |
| 56 | const roleMenus = ref<string[]>([]); | 56 | const roleMenus = ref<string[]>([]); |
| 57 | const allCheckedKeys = ref<string[]>([]); | 57 | const allCheckedKeys = ref<string[]>([]); |
| 58 | const roleId = ref(''); | 58 | const roleId = ref(''); |
| @@ -66,8 +66,6 @@ | @@ -66,8 +66,6 @@ | ||
| 66 | showActionButtonGroup: false, | 66 | showActionButtonGroup: false, |
| 67 | }); | 67 | }); |
| 68 | 68 | ||
| 69 | - const originMenus = ref(); | ||
| 70 | - | ||
| 71 | const transformName = (data: TreeData[]) => { | 69 | const transformName = (data: TreeData[]) => { |
| 72 | return data.map((item) => { | 70 | return data.map((item) => { |
| 73 | item.name = t(item.name); | 71 | item.name = t(item.name); |
| @@ -80,8 +78,6 @@ | @@ -80,8 +78,6 @@ | ||
| 80 | 78 | ||
| 81 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | 79 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
| 82 | allCheckedKeys.value = []; | 80 | allCheckedKeys.value = []; |
| 83 | - originMenus.value = []; | ||
| 84 | - allCheckedKeys.value.length = 0; | ||
| 85 | resetFields(); | 81 | resetFields(); |
| 86 | roleId.value = ''; | 82 | roleId.value = ''; |
| 87 | // 在打开弹窗时清除所有选择的菜单 | 83 | // 在打开弹窗时清除所有选择的菜单 |
| @@ -108,12 +104,12 @@ | @@ -108,12 +104,12 @@ | ||
| 108 | 104 | ||
| 109 | // 更新 | 105 | // 更新 |
| 110 | if (unref(isUpdate)) { | 106 | if (unref(isUpdate)) { |
| 111 | - allCheckedKeys.value = []; | ||
| 112 | checked.value = []; | 107 | checked.value = []; |
| 113 | roleId.value = data.record.id; | 108 | roleId.value = data.record.id; |
| 114 | 109 | ||
| 115 | //通过角色id去获取角色对应的菜单的ids | 110 | //通过角色id去获取角色对应的菜单的ids |
| 116 | - originMenus.value = roleMenus.value = await getMenusIdsByRoleId(data.record.id); | 111 | + allCheckedKeys.value = roleMenus.value = await getMenusIdsByRoleId(data.record.id); |
| 112 | + excludeHalfCheckedKeys(unref(treeData)); | ||
| 117 | 113 | ||
| 118 | await nextTick(); | 114 | await nextTick(); |
| 119 | treeRef.value.setCheckedKeys(roleMenus.value); | 115 | treeRef.value.setCheckedKeys(roleMenus.value); |
| @@ -140,7 +136,7 @@ | @@ -140,7 +136,7 @@ | ||
| 140 | remark: values.remark, | 136 | remark: values.remark, |
| 141 | status: values.status, | 137 | status: values.status, |
| 142 | roleType: RoleEnum.TENANT_ADMIN, | 138 | roleType: RoleEnum.TENANT_ADMIN, |
| 143 | - menu: unref(treeRef).getCheckedKeys() || [], | 139 | + menu: unref(allCheckedKeys) || [], |
| 144 | }; | 140 | }; |
| 145 | if (req.menu == undefined) return createMessage.error('请勾选权限菜单'); | 141 | if (req.menu == undefined) return createMessage.error('请勾选权限菜单'); |
| 146 | const res = await saveOrUpdateRoleInfoWithMenu(req); | 142 | const res = await saveOrUpdateRoleInfoWithMenu(req); |
| @@ -229,6 +225,25 @@ | @@ -229,6 +225,25 @@ | ||
| 229 | return result; | 225 | return result; |
| 230 | }; | 226 | }; |
| 231 | 227 | ||
| 228 | + const excludeHalfCheckedKeys = (treeData: MenuRecord[]) => { | ||
| 229 | + const needExcludeKeys: string[] = []; | ||
| 230 | + const query = (data: MenuRecord[]) => { | ||
| 231 | + data.forEach((item) => { | ||
| 232 | + item.checked = roleMenus.value.includes(item.id); | ||
| 233 | + if (item.children && item.children.length) { | ||
| 234 | + query(item.children); | ||
| 235 | + item.checked = item.children.every((item) => item.checked); | ||
| 236 | + } | ||
| 237 | + if (!item.checked) { | ||
| 238 | + needExcludeKeys.push(item.id); | ||
| 239 | + } | ||
| 240 | + }); | ||
| 241 | + }; | ||
| 242 | + query(treeData); | ||
| 243 | + roleMenus.value = unref(roleMenus).filter((key) => !needExcludeKeys.includes(key)); | ||
| 244 | + return needExcludeKeys; | ||
| 245 | + }; | ||
| 246 | + | ||
| 232 | return { | 247 | return { |
| 233 | spinning, | 248 | spinning, |
| 234 | registerDrawer, | 249 | registerDrawer, |