Showing
7 changed files
with
82 additions
and
93 deletions
| @@ -42,7 +42,7 @@ export interface MenuRecord { | @@ -42,7 +42,7 @@ export interface MenuRecord { | ||
| 42 | component: string; | 42 | component: string; |
| 43 | meta: Meta; | 43 | meta: Meta; |
| 44 | disabled?: boolean; | 44 | disabled?: boolean; |
| 45 | - isDictCompareDisabled?: boolean; | 45 | + show?: boolean; |
| 46 | icon?: string; | 46 | icon?: string; |
| 47 | title?: string; | 47 | title?: string; |
| 48 | key?: string; | 48 | key?: string; |
| @@ -7,4 +7,12 @@ export enum DictEnum { | @@ -7,4 +7,12 @@ export enum DictEnum { | ||
| 7 | DATA_VALIDATE = 'data_validate', | 7 | DATA_VALIDATE = 'data_validate', |
| 8 | // 设备类型 | 8 | // 设备类型 |
| 9 | DEVICE_TYPE = 'device_type', | 9 | DEVICE_TYPE = 'device_type', |
| 10 | + // 平台管理员启用的权限 | ||
| 11 | + ENABLED_PLATFORM_ADMIN_AUTH = 'enabled_platform_admin_auth', | ||
| 12 | + // 系统管理员启用的权限 | ||
| 13 | + ENABLED_SYSADMIN_AUTH = 'enabled_sysadmin_auth', | ||
| 14 | + // 租户禁用的权限 | ||
| 15 | + DISABLED_TENANT_AUTH = 'disabled_tenant_auth', | ||
| 16 | + // 客户禁用的权限 | ||
| 17 | + DISABLE_CUSTOMER_AUTH = 'disabled_customer_auth', | ||
| 10 | } | 18 | } |
| @@ -17,7 +17,7 @@ function joinParentPath(menus: Menu[], parentPath = '') { | @@ -17,7 +17,7 @@ function joinParentPath(menus: Menu[], parentPath = '') { | ||
| 17 | // https://next.router.vuejs.org/guide/essentials/nested-routes.html | 17 | // https://next.router.vuejs.org/guide/essentials/nested-routes.html |
| 18 | // Note that nested paths that start with / will be treated as a root path. | 18 | // Note that nested paths that start with / will be treated as a root path. |
| 19 | // This allows you to leverage the component nesting without having to use a nested URL. | 19 | // This allows you to leverage the component nesting without having to use a nested URL. |
| 20 | - if (!(menu.path.startsWith('/') || isUrl(menu.path))) { | 20 | + if (!(menu?.path?.startsWith('/') || isUrl(menu.path))) { |
| 21 | // path doesn't start with /, nor is it a url, join parent path | 21 | // path doesn't start with /, nor is it a url, join parent path |
| 22 | menu.path = `${parentPath}/${menu.path}`; | 22 | menu.path = `${parentPath}/${menu.path}`; |
| 23 | } | 23 | } |
| @@ -91,7 +91,6 @@ | @@ -91,7 +91,6 @@ | ||
| 91 | }); | 91 | }); |
| 92 | const getRoleList = async () => { | 92 | const getRoleList = async () => { |
| 93 | const res = await filterRoleList(); | 93 | const res = await filterRoleList(); |
| 94 | - console.log(res); | ||
| 95 | roleOptions.value = res.map((m) => { | 94 | roleOptions.value = res.map((m) => { |
| 96 | return { | 95 | return { |
| 97 | label: m.name, | 96 | label: m.name, |
| @@ -84,8 +84,11 @@ | @@ -84,8 +84,11 @@ | ||
| 84 | // 在打开弹窗时清除所有选择的菜单 | 84 | // 在打开弹窗时清除所有选择的菜单 |
| 85 | treeRef.value && treeRef.value?.setCheckedKeys([]); | 85 | treeRef.value && treeRef.value?.setCheckedKeys([]); |
| 86 | isUpdate.value = data.isUpdate; | 86 | isUpdate.value = data.isUpdate; |
| 87 | - const roleType = data?.record?.roleType || userStore.getRoleList.at(0); | ||
| 88 | - | 87 | + let roleType = (userStore.getUserInfo.roles![0] as RoleEnum) || RoleEnum.SYS_ADMIN; |
| 88 | + // 租户管理员创建角色时 菜单分配为客户菜单 | ||
| 89 | + if (roleType === RoleEnum.TENANT_ADMIN) { | ||
| 90 | + roleType = RoleEnum.CUSTOMER_USER; | ||
| 91 | + } | ||
| 89 | try { | 92 | try { |
| 90 | spinning.value = true; | 93 | spinning.value = true; |
| 91 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 | 94 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 |
| @@ -98,7 +101,7 @@ | @@ -98,7 +101,7 @@ | ||
| 98 | 101 | ||
| 99 | const keys = await getPermissionByRole(roleType); | 102 | const keys = await getPermissionByRole(roleType); |
| 100 | const { keyType } = RoleMenuDictEnum[roleType]; | 103 | const { keyType } = RoleMenuDictEnum[roleType]; |
| 101 | - treeData.value = getPermissionTreeData( | 104 | + treeData.value = filterPermissionTreeData( |
| 102 | unref(treeData) as unknown as TreeData[], | 105 | unref(treeData) as unknown as TreeData[], |
| 103 | keys, | 106 | keys, |
| 104 | keyType | 107 | keyType |
| @@ -164,61 +167,46 @@ | @@ -164,61 +167,46 @@ | ||
| 164 | return []; | 167 | return []; |
| 165 | }; | 168 | }; |
| 166 | 169 | ||
| 167 | - const getPermissionTreeData = ( | 170 | + const filterPermissionTreeData = ( |
| 168 | data: MenuRecord[], | 171 | data: MenuRecord[], |
| 169 | permissionKeys: string[], | 172 | permissionKeys: string[], |
| 170 | keysType: KeysTypeEnum | 173 | keysType: KeysTypeEnum |
| 171 | - ) => { | ||
| 172 | - const setDisabled = (data: MenuRecord[], flag: boolean) => { | ||
| 173 | - return data.map((item) => { | ||
| 174 | - item.name = t(item.name); | ||
| 175 | - if (item.children && item.children.length) { | ||
| 176 | - item.children = setDisabled(item.children, flag); | ||
| 177 | - } | ||
| 178 | - return { | ||
| 179 | - ...item, | ||
| 180 | - disabled: flag, | ||
| 181 | - icon: item.meta.icon, | ||
| 182 | - } as TreeData; | ||
| 183 | - }); | ||
| 184 | - }; | ||
| 185 | - | 174 | + ): TreeData[] => { |
| 186 | const permissionCompare = ( | 175 | const permissionCompare = ( |
| 187 | data: MenuRecord[], | 176 | data: MenuRecord[], |
| 188 | permissionKeys: string[], | 177 | permissionKeys: string[], |
| 189 | keysType: KeysTypeEnum | 178 | keysType: KeysTypeEnum |
| 190 | - ) => { | ||
| 191 | - return data.map((item) => { | 179 | + ): TreeData[] => { |
| 180 | + return data.filter((item) => { | ||
| 192 | item.name = t(item.name); | 181 | item.name = t(item.name); |
| 193 | const findFlag = permissionKeys.includes(item.permission); | 182 | const findFlag = permissionKeys.includes(item.permission); |
| 194 | - if (findFlag) item.isDictCompareDisabled = true; | ||
| 195 | - const disabledFlag = keysType === KeysTypeEnum.DISABLED ? findFlag : !findFlag; | ||
| 196 | - item.disabled = disabledFlag; | ||
| 197 | 183 | ||
| 198 | - if (item.isDictCompareDisabled && item.children && item.children.length) { | ||
| 199 | - setDisabled(item.children, disabledFlag); | ||
| 200 | - } else { | ||
| 201 | - if (item.children && item.children.length) { | 184 | + item.show = findFlag ? keysType === KeysTypeEnum.ENABLED : undefined; |
| 185 | + | ||
| 186 | + if (item.children && item.children.length) { | ||
| 187 | + if (item.show) return true; | ||
| 188 | + if (item.show === undefined) { | ||
| 202 | item.children = permissionCompare(item.children, permissionKeys, keysType); | 189 | item.children = permissionCompare(item.children, permissionKeys, keysType); |
| 203 | - item.disabled = item.children.every((temp) => temp.disabled); | 190 | + item.show = item.children.some((item) => |
| 191 | + keysType === KeysTypeEnum.ENABLED | ||
| 192 | + ? item.show | ||
| 193 | + : item.show === undefined | ||
| 194 | + ? true | ||
| 195 | + : item.show | ||
| 196 | + ); | ||
| 197 | + return item.show; | ||
| 204 | } | 198 | } |
| 205 | } | 199 | } |
| 206 | - return { | ||
| 207 | - ...item, | ||
| 208 | - icon: item.meta.icon, | ||
| 209 | - } as TreeData; | ||
| 210 | - }); | ||
| 211 | - }; | ||
| 212 | 200 | ||
| 213 | - const result = permissionCompare(data, permissionKeys, keysType).map((item) => { | ||
| 214 | - if (item.children && item.children.length) { | ||
| 215 | - const rootDisabledFlag = item.children.every((temp) => temp.disabled); | ||
| 216 | - item.disabled = rootDisabledFlag; | ||
| 217 | - } | ||
| 218 | - return item; | ||
| 219 | - }); | 201 | + return keysType === KeysTypeEnum.ENABLED |
| 202 | + ? item.show | ||
| 203 | + : item.show === undefined | ||
| 204 | + ? true | ||
| 205 | + : item.show; | ||
| 206 | + }) as unknown as TreeData[]; | ||
| 207 | + }; | ||
| 220 | 208 | ||
| 221 | - return result; | 209 | + return permissionCompare(data, permissionKeys, keysType); |
| 222 | }; | 210 | }; |
| 223 | 211 | ||
| 224 | const excludeHalfCheckedKeys = (treeData: MenuRecord[]) => { | 212 | const excludeHalfCheckedKeys = (treeData: MenuRecord[]) => { |
| 1 | import { BasicColumn } from '/@/components/Table'; | 1 | import { BasicColumn } from '/@/components/Table'; |
| 2 | import { FormSchema } from '/@/components/Table'; | 2 | import { FormSchema } from '/@/components/Table'; |
| 3 | +import { DictEnum } from '/@/enums/dictEnum'; | ||
| 3 | import { RoleEnum } from '/@/enums/roleEnum'; | 4 | import { RoleEnum } from '/@/enums/roleEnum'; |
| 4 | 5 | ||
| 5 | export enum KeysTypeEnum { | 6 | export enum KeysTypeEnum { |
| @@ -8,10 +9,13 @@ export enum KeysTypeEnum { | @@ -8,10 +9,13 @@ export enum KeysTypeEnum { | ||
| 8 | } | 9 | } |
| 9 | 10 | ||
| 10 | export const RoleMenuDictEnum: Recordable<{ key: string; keyType: KeysTypeEnum }> = { | 11 | export const RoleMenuDictEnum: Recordable<{ key: string; keyType: KeysTypeEnum }> = { |
| 11 | - [RoleEnum.PLATFORM_ADMIN]: { key: 'enabled_platform_admin_auth', keyType: KeysTypeEnum.ENABLED }, | ||
| 12 | - [RoleEnum.SYS_ADMIN]: { key: 'enabled_sysadmin_auth', keyType: KeysTypeEnum.ENABLED }, | ||
| 13 | - [RoleEnum.TENANT_ADMIN]: { key: 'disabled_tenant_auth', keyType: KeysTypeEnum.DISABLED }, | ||
| 14 | - [RoleEnum.CUSTOMER_USER]: { key: 'disabled_tenant_auth', keyType: KeysTypeEnum.DISABLED }, | 12 | + [RoleEnum.PLATFORM_ADMIN]: { |
| 13 | + key: DictEnum.ENABLED_PLATFORM_ADMIN_AUTH, | ||
| 14 | + keyType: KeysTypeEnum.ENABLED, | ||
| 15 | + }, | ||
| 16 | + [RoleEnum.SYS_ADMIN]: { key: DictEnum.ENABLED_SYSADMIN_AUTH, keyType: KeysTypeEnum.ENABLED }, | ||
| 17 | + [RoleEnum.TENANT_ADMIN]: { key: DictEnum.DISABLED_TENANT_AUTH, keyType: KeysTypeEnum.DISABLED }, | ||
| 18 | + [RoleEnum.CUSTOMER_USER]: { key: DictEnum.DISABLE_CUSTOMER_AUTH, keyType: KeysTypeEnum.DISABLED }, | ||
| 15 | }; | 19 | }; |
| 16 | 20 | ||
| 17 | export const columns: BasicColumn[] = [ | 21 | export const columns: BasicColumn[] = [ |
| @@ -43,6 +43,7 @@ | @@ -43,6 +43,7 @@ | ||
| 43 | import { KeysTypeEnum, RoleMenuDictEnum } from '../../system/role/role.data'; | 43 | import { KeysTypeEnum, RoleMenuDictEnum } from '../../system/role/role.data'; |
| 44 | import { findDictItemByCode } from '/@/api/system/dict'; | 44 | import { findDictItemByCode } from '/@/api/system/dict'; |
| 45 | import { Spin } from 'ant-design-vue'; | 45 | import { Spin } from 'ant-design-vue'; |
| 46 | + import { useUserStore } from '/@/store/modules/user'; | ||
| 46 | 47 | ||
| 47 | type TreeData = MenuRecord & TreeItem; | 48 | type TreeData = MenuRecord & TreeItem; |
| 48 | 49 | ||
| @@ -76,6 +77,7 @@ | @@ -76,6 +77,7 @@ | ||
| 76 | }); | 77 | }); |
| 77 | }; | 78 | }; |
| 78 | 79 | ||
| 80 | + const userStore = useUserStore(); | ||
| 79 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | 81 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
| 80 | allCheckedKeys.value = []; | 82 | allCheckedKeys.value = []; |
| 81 | resetFields(); | 83 | resetFields(); |
| @@ -83,7 +85,11 @@ | @@ -83,7 +85,11 @@ | ||
| 83 | // 在打开弹窗时清除所有选择的菜单 | 85 | // 在打开弹窗时清除所有选择的菜单 |
| 84 | treeRef.value && treeRef.value?.setCheckedKeys([]); | 86 | treeRef.value && treeRef.value?.setCheckedKeys([]); |
| 85 | isUpdate.value = data.isUpdate; | 87 | isUpdate.value = data.isUpdate; |
| 86 | - const roleType = data?.record?.roleType || RoleEnum.TENANT_ADMIN; | 88 | + let roleType = (userStore.getUserInfo.roles![0] as RoleEnum) || RoleEnum.SYS_ADMIN; |
| 89 | + // 平台管理员创建角色时 菜单分配为租户管理员可分配的菜单 | ||
| 90 | + if (roleType === RoleEnum.PLATFORM_ADMIN) { | ||
| 91 | + roleType = RoleEnum.TENANT_ADMIN; | ||
| 92 | + } | ||
| 87 | try { | 93 | try { |
| 88 | spinning.value = true; | 94 | spinning.value = true; |
| 89 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 | 95 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 |
| @@ -93,10 +99,9 @@ | @@ -93,10 +99,9 @@ | ||
| 93 | const menuListModel = await getMenuList(); | 99 | const menuListModel = await getMenuList(); |
| 94 | treeData.value = transformName(menuListModel as unknown as TreeData[]); | 100 | treeData.value = transformName(menuListModel as unknown as TreeData[]); |
| 95 | } | 101 | } |
| 96 | - | ||
| 97 | const keys = await getPermissionByRole(roleType); | 102 | const keys = await getPermissionByRole(roleType); |
| 98 | const { keyType } = RoleMenuDictEnum[roleType]; | 103 | const { keyType } = RoleMenuDictEnum[roleType]; |
| 99 | - treeData.value = getPermissionTreeData( | 104 | + treeData.value = filterPermissionTreeData( |
| 100 | unref(treeData) as unknown as TreeData[], | 105 | unref(treeData) as unknown as TreeData[], |
| 101 | keys, | 106 | keys, |
| 102 | keyType | 107 | keyType |
| @@ -168,61 +173,46 @@ | @@ -168,61 +173,46 @@ | ||
| 168 | return []; | 173 | return []; |
| 169 | }; | 174 | }; |
| 170 | 175 | ||
| 171 | - const getPermissionTreeData = ( | 176 | + const filterPermissionTreeData = ( |
| 172 | data: MenuRecord[], | 177 | data: MenuRecord[], |
| 173 | permissionKeys: string[], | 178 | permissionKeys: string[], |
| 174 | keysType: KeysTypeEnum | 179 | keysType: KeysTypeEnum |
| 175 | - ) => { | ||
| 176 | - const setDisabled = (data: MenuRecord[], flag: boolean) => { | ||
| 177 | - return data.map((item) => { | ||
| 178 | - item.name = t(item.name); | ||
| 179 | - if (item.children && item.children.length) { | ||
| 180 | - item.children = setDisabled(item.children, flag); | ||
| 181 | - } | ||
| 182 | - return { | ||
| 183 | - ...item, | ||
| 184 | - disabled: flag, | ||
| 185 | - icon: item.meta.icon, | ||
| 186 | - } as TreeData; | ||
| 187 | - }); | ||
| 188 | - }; | ||
| 189 | - | 180 | + ): TreeData[] => { |
| 190 | const permissionCompare = ( | 181 | const permissionCompare = ( |
| 191 | data: MenuRecord[], | 182 | data: MenuRecord[], |
| 192 | permissionKeys: string[], | 183 | permissionKeys: string[], |
| 193 | keysType: KeysTypeEnum | 184 | keysType: KeysTypeEnum |
| 194 | - ) => { | ||
| 195 | - return data.map((item) => { | 185 | + ): TreeData[] => { |
| 186 | + return data.filter((item) => { | ||
| 196 | item.name = t(item.name); | 187 | item.name = t(item.name); |
| 197 | const findFlag = permissionKeys.includes(item.permission); | 188 | const findFlag = permissionKeys.includes(item.permission); |
| 198 | - if (findFlag) item.isDictCompareDisabled = true; | ||
| 199 | - const disabledFlag = keysType === KeysTypeEnum.DISABLED ? findFlag : !findFlag; | ||
| 200 | - item.disabled = disabledFlag; | ||
| 201 | 189 | ||
| 202 | - if (item.isDictCompareDisabled && item.children && item.children.length) { | ||
| 203 | - setDisabled(item.children, disabledFlag); | ||
| 204 | - } else { | ||
| 205 | - if (item.children && item.children.length) { | 190 | + item.show = findFlag ? keysType === KeysTypeEnum.ENABLED : undefined; |
| 191 | + | ||
| 192 | + if (item.children && item.children.length) { | ||
| 193 | + if (item.show) return true; | ||
| 194 | + if (item.show === undefined) { | ||
| 206 | item.children = permissionCompare(item.children, permissionKeys, keysType); | 195 | item.children = permissionCompare(item.children, permissionKeys, keysType); |
| 207 | - item.disabled = item.children.every((temp) => temp.disabled); | 196 | + item.show = item.children.some((item) => |
| 197 | + keysType === KeysTypeEnum.ENABLED | ||
| 198 | + ? item.show | ||
| 199 | + : item.show === undefined | ||
| 200 | + ? true | ||
| 201 | + : item.show | ||
| 202 | + ); | ||
| 203 | + return item.show; | ||
| 208 | } | 204 | } |
| 209 | } | 205 | } |
| 210 | - return { | ||
| 211 | - ...item, | ||
| 212 | - icon: item.meta.icon, | ||
| 213 | - } as TreeData; | ||
| 214 | - }); | ||
| 215 | - }; | ||
| 216 | 206 | ||
| 217 | - const result = permissionCompare(data, permissionKeys, keysType).map((item) => { | ||
| 218 | - if (item.children && item.children.length) { | ||
| 219 | - const rootDisabledFlag = item.children.every((temp) => temp.disabled); | ||
| 220 | - item.disabled = rootDisabledFlag; | ||
| 221 | - } | ||
| 222 | - return item; | ||
| 223 | - }); | 207 | + return keysType === KeysTypeEnum.ENABLED |
| 208 | + ? item.show | ||
| 209 | + : item.show === undefined | ||
| 210 | + ? true | ||
| 211 | + : item.show; | ||
| 212 | + }) as unknown as TreeData[]; | ||
| 213 | + }; | ||
| 224 | 214 | ||
| 225 | - return result; | 215 | + return permissionCompare(data, permissionKeys, keysType); |
| 226 | }; | 216 | }; |
| 227 | 217 | ||
| 228 | const excludeHalfCheckedKeys = (treeData: MenuRecord[]) => { | 218 | const excludeHalfCheckedKeys = (treeData: MenuRecord[]) => { |