Showing
6 changed files
with
133 additions
and
55 deletions
@@ -30,6 +30,38 @@ export const getMenuList = (args?: number) => { | @@ -30,6 +30,38 @@ export const getMenuList = (args?: number) => { | ||
30 | } catch (e) {} | 30 | } catch (e) {} |
31 | }; | 31 | }; |
32 | 32 | ||
33 | +/** | ||
34 | + * @description 获取自身的权限 | ||
35 | + * @param args | ||
36 | + * @returns | ||
37 | + */ | ||
38 | +export const getMeMenuList = (args?: number) => { | ||
39 | + try { | ||
40 | + return defHttp.get<getMenuListResultModel>({ | ||
41 | + url: Api.GetMenuList, | ||
42 | + params: { | ||
43 | + needButton: args == 1 ? false : null, | ||
44 | + }, | ||
45 | + }); | ||
46 | + } catch (e) {} | ||
47 | +}; | ||
48 | + | ||
49 | +/** | ||
50 | + * @description 获取超级管理员菜单 | ||
51 | + * @param args | ||
52 | + * @returns | ||
53 | + */ | ||
54 | +export const getAdminMenuList = (args?: number) => { | ||
55 | + try { | ||
56 | + return defHttp.get<getMenuListResultModel>({ | ||
57 | + url: Api.SysAdminMenuList, | ||
58 | + params: { | ||
59 | + needButton: args == 1 ? false : null, | ||
60 | + }, | ||
61 | + }); | ||
62 | + } catch (e) {} | ||
63 | +}; | ||
64 | + | ||
33 | export const delMenu = (menuIds: string[]) => { | 65 | export const delMenu = (menuIds: string[]) => { |
34 | const url = Api.BaseMenuUrl; | 66 | const url = Api.BaseMenuUrl; |
35 | return defHttp.delete({ url: url, data: menuIds }); | 67 | return defHttp.delete({ url: url, data: menuIds }); |
@@ -9,6 +9,8 @@ export enum DictEnum { | @@ -9,6 +9,8 @@ export enum DictEnum { | ||
9 | DEVICE_TYPE = 'device_type', | 9 | DEVICE_TYPE = 'device_type', |
10 | // 平台管理员启用的权限 | 10 | // 平台管理员启用的权限 |
11 | ENABLED_PLATFORM_ADMIN_AUTH = 'enabled_platform_admin_auth', | 11 | ENABLED_PLATFORM_ADMIN_AUTH = 'enabled_platform_admin_auth', |
12 | + // 平台管理员禁用的权限 | ||
13 | + DISABLED_PLATFORM_ADMIN_AUTH = 'disabled_platform_admin_auth', | ||
12 | // 系统管理员启用的权限 | 14 | // 系统管理员启用的权限 |
13 | ENABLED_SYSADMIN_AUTH = 'enabled_sysadmin_auth', | 15 | ENABLED_SYSADMIN_AUTH = 'enabled_sysadmin_auth', |
14 | // 租户禁用的权限 | 16 | // 租户禁用的权限 |
src/hooks/business/useRole.ts
0 → 100644
1 | +import { computed, unref } from 'vue'; | ||
2 | +import { useUserStore } from '/@/store/modules/user'; | ||
3 | +import { RoleEnum } from '/@/enums/roleEnum'; | ||
4 | + | ||
5 | +export const useRole = () => { | ||
6 | + const userStore = useUserStore(); | ||
7 | + | ||
8 | + const getRole = computed(() => { | ||
9 | + return userStore.userInfo?.roles![0] as RoleEnum; | ||
10 | + }); | ||
11 | + | ||
12 | + const isPlatformAdmin = computed(() => { | ||
13 | + return unref(getRole) === RoleEnum.PLATFORM_ADMIN; | ||
14 | + }); | ||
15 | + | ||
16 | + const isCustomerUser = computed(() => { | ||
17 | + return unref(getRole) === RoleEnum.CUSTOMER_USER; | ||
18 | + }); | ||
19 | + | ||
20 | + const isTenantAdmin = computed(() => { | ||
21 | + return unref(getRole) === RoleEnum.TENANT_ADMIN; | ||
22 | + }); | ||
23 | + | ||
24 | + const isSysadmin = computed(() => { | ||
25 | + return unref(getRole) === RoleEnum.SYS_ADMIN; | ||
26 | + }); | ||
27 | + | ||
28 | + return { getRole, isPlatformAdmin, isCustomerUser, isTenantAdmin, isSysadmin }; | ||
29 | +}; |
@@ -35,14 +35,15 @@ | @@ -35,14 +35,15 @@ | ||
35 | import { useMessage } from '/@/hooks/web/useMessage'; | 35 | import { useMessage } from '/@/hooks/web/useMessage'; |
36 | const { t } = useI18n(); //加载国际化 | 36 | const { t } = useI18n(); //加载国际化 |
37 | // 加载菜单数据 | 37 | // 加载菜单数据 |
38 | - import { getMenuList, getMenusIdsByRoleId } from '/@/api/sys/menu'; | 38 | + import { getMeMenuList, getMenusIdsByRoleId } from '/@/api/sys/menu'; |
39 | import { useI18n } from '/@/hooks/web/useI18n'; | 39 | import { useI18n } from '/@/hooks/web/useI18n'; |
40 | import { MenuRecord } from '/@/api/sys/model/menuModel'; | 40 | import { MenuRecord } from '/@/api/sys/model/menuModel'; |
41 | import { saveOrUpdateRoleInfoWithMenu } from '/@/api/system/system'; | 41 | import { saveOrUpdateRoleInfoWithMenu } from '/@/api/system/system'; |
42 | import { findDictItemByCode } from '/@/api/system/dict'; | 42 | import { findDictItemByCode } from '/@/api/system/dict'; |
43 | import { RoleEnum } from '/@/enums/roleEnum'; | 43 | import { RoleEnum } from '/@/enums/roleEnum'; |
44 | import { Spin } from 'ant-design-vue'; | 44 | import { Spin } from 'ant-design-vue'; |
45 | - import { useUserStore } from '/@/store/modules/user'; | 45 | + import { useRole } from '/@/hooks/business/useRole'; |
46 | + import { RoleListItem } from '/@/api/system/model/systemModel'; | ||
46 | 47 | ||
47 | type TreeData = MenuRecord & TreeItem; | 48 | type TreeData = MenuRecord & TreeItem; |
48 | 49 | ||
@@ -76,56 +77,72 @@ | @@ -76,56 +77,72 @@ | ||
76 | }); | 77 | }); |
77 | }; | 78 | }; |
78 | 79 | ||
79 | - const userStore = useUserStore(); | ||
80 | - const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | ||
81 | - allCheckedKeys.value = []; | ||
82 | - resetFields(); | ||
83 | - roleId.value = ''; | ||
84 | - // 在打开弹窗时清除所有选择的菜单 | ||
85 | - treeRef.value && treeRef.value?.setCheckedKeys([]); | ||
86 | - isUpdate.value = data.isUpdate; | ||
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 | - } | ||
92 | - try { | ||
93 | - spinning.value = true; | ||
94 | - // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 | 80 | + const { isTenantAdmin, isSysadmin, getRole } = useRole(); |
81 | + const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner( | ||
82 | + async (data: { isUpdate: boolean; record: RoleListItem }) => { | ||
83 | + allCheckedKeys.value = []; | ||
84 | + resetFields(); | ||
85 | + roleId.value = ''; | ||
86 | + // 在打开弹窗时清除所有选择的菜单 | ||
87 | + treeRef.value && treeRef.value?.setCheckedKeys([]); | ||
88 | + isUpdate.value = data.isUpdate; | ||
89 | + let roleType = unref(getRole) || RoleEnum.SYS_ADMIN; | ||
90 | + | ||
91 | + // 租户管理员创建角色时 菜单分配为客户菜单 | ||
92 | + if (unref(isTenantAdmin)) { | ||
93 | + roleType = RoleEnum.CUSTOMER_USER; | ||
94 | + } | ||
95 | + | ||
96 | + try { | ||
97 | + spinning.value = true; | ||
98 | + // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 | ||
95 | 99 | ||
96 | - if (!unref(treeData).length) { | 100 | + // if (!unref(treeData).length) { |
97 | // 获取全部的菜单 | 101 | // 获取全部的菜单 |
98 | - const menuListModel = await getMenuList(); | 102 | + const menuListModel = await getMeMenuList(); |
99 | treeData.value = transformName(menuListModel as unknown as TreeData[]); | 103 | treeData.value = transformName(menuListModel as unknown as TreeData[]); |
100 | - } | 104 | + // } |
101 | 105 | ||
102 | - const keys = await getPermissionByRole(roleType); | ||
103 | - const { keyType } = RoleMenuDictEnum[roleType]; | ||
104 | - treeData.value = filterPermissionTreeData( | ||
105 | - unref(treeData) as unknown as TreeData[], | ||
106 | - keys, | ||
107 | - keyType | ||
108 | - ); | 106 | + const keys = await getPermissionByRole(roleType); |
107 | + const { keyType } = RoleMenuDictEnum[roleType]; | ||
108 | + treeData.value = filterPermissionTreeData( | ||
109 | + unref(treeData) as unknown as TreeData[], | ||
110 | + keys, | ||
111 | + keyType | ||
112 | + ); | ||
109 | 113 | ||
110 | - // 更新 | ||
111 | - if (unref(isUpdate)) { | ||
112 | - checked.value = []; | ||
113 | - roleId.value = data.record.id; | 114 | + // 如果编辑的是超级管理员 则不再过滤平台管理员禁用的权限 |
115 | + // 如果是超级管理员创建角色 创建角色属于平台管理员 因此过滤平台管理员禁用的权限 | ||
116 | + if (data?.record?.roleType !== RoleEnum.SYS_ADMIN && unref(isSysadmin)) { | ||
117 | + const keys = await getPermissionByRole(RoleEnum.PLATFORM_ADMIN); | ||
118 | + const { keyType } = RoleMenuDictEnum[RoleEnum.PLATFORM_ADMIN]; | ||
119 | + treeData.value = filterPermissionTreeData( | ||
120 | + unref(treeData) as unknown as TreeData[], | ||
121 | + keys, | ||
122 | + keyType | ||
123 | + ); | ||
124 | + } | ||
125 | + | ||
126 | + // 更新 | ||
127 | + if (unref(isUpdate)) { | ||
128 | + checked.value = []; | ||
129 | + roleId.value = data.record.id; | ||
114 | 130 | ||
115 | - //通过角色id去获取角色对应的菜单的ids | ||
116 | - allCheckedKeys.value = roleMenus.value = await getMenusIdsByRoleId(data.record.id); | ||
117 | - excludeHalfCheckedKeys(unref(treeData)); | ||
118 | - await nextTick(); | ||
119 | - treeRef.value.setCheckedKeys(roleMenus.value); | ||
120 | - setFieldsValue(data.record); | ||
121 | - } else { | 131 | + //通过角色id去获取角色对应的菜单的ids |
132 | + allCheckedKeys.value = roleMenus.value = await getMenusIdsByRoleId(data.record.id); | ||
133 | + excludeHalfCheckedKeys(unref(treeData)); | ||
134 | + await nextTick(); | ||
135 | + treeRef.value.setCheckedKeys(roleMenus.value); | ||
136 | + setFieldsValue(data.record); | ||
137 | + } else { | ||
138 | + } | ||
139 | + } catch (error) { | ||
140 | + throw error; | ||
141 | + } finally { | ||
142 | + spinning.value = false; | ||
122 | } | 143 | } |
123 | - } catch (error) { | ||
124 | - throw error; | ||
125 | - } finally { | ||
126 | - spinning.value = false; | ||
127 | } | 144 | } |
128 | - }); | 145 | + ); |
129 | 146 | ||
130 | const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色')); | 147 | const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色')); |
131 | 148 |
@@ -10,8 +10,8 @@ export enum KeysTypeEnum { | @@ -10,8 +10,8 @@ export enum KeysTypeEnum { | ||
10 | 10 | ||
11 | export const RoleMenuDictEnum: Recordable<{ key: string; keyType: KeysTypeEnum }> = { | 11 | export const RoleMenuDictEnum: Recordable<{ key: string; keyType: KeysTypeEnum }> = { |
12 | [RoleEnum.PLATFORM_ADMIN]: { | 12 | [RoleEnum.PLATFORM_ADMIN]: { |
13 | - key: DictEnum.ENABLED_PLATFORM_ADMIN_AUTH, | ||
14 | - keyType: KeysTypeEnum.ENABLED, | 13 | + key: DictEnum.DISABLED_PLATFORM_ADMIN_AUTH, |
14 | + keyType: KeysTypeEnum.DISABLED, | ||
15 | }, | 15 | }, |
16 | [RoleEnum.SYS_ADMIN]: { key: DictEnum.ENABLED_SYSADMIN_AUTH, keyType: KeysTypeEnum.ENABLED }, | 16 | [RoleEnum.SYS_ADMIN]: { key: DictEnum.ENABLED_SYSADMIN_AUTH, keyType: KeysTypeEnum.ENABLED }, |
17 | [RoleEnum.TENANT_ADMIN]: { key: DictEnum.DISABLED_TENANT_AUTH, keyType: KeysTypeEnum.DISABLED }, | 17 | [RoleEnum.TENANT_ADMIN]: { key: DictEnum.DISABLED_TENANT_AUTH, keyType: KeysTypeEnum.DISABLED }, |
@@ -34,7 +34,7 @@ | @@ -34,7 +34,7 @@ | ||
34 | import { BasicTree, TreeItem } from '/@/components/Tree'; | 34 | import { BasicTree, TreeItem } from '/@/components/Tree'; |
35 | const { t } = useI18n(); //加载国际化 | 35 | const { t } = useI18n(); //加载国际化 |
36 | // 加载菜单数据 | 36 | // 加载菜单数据 |
37 | - import { getMenuList, getMenusIdsByRoleId } from '/@/api/sys/menu'; | 37 | + import { getAdminMenuList, getMenuList, getMenusIdsByRoleId } from '/@/api/sys/menu'; |
38 | import { useI18n } from '/@/hooks/web/useI18n'; | 38 | import { useI18n } from '/@/hooks/web/useI18n'; |
39 | import { MenuRecord } from '/@/api/sys/model/menuModel'; | 39 | import { MenuRecord } from '/@/api/sys/model/menuModel'; |
40 | import { saveOrUpdateRoleInfoWithMenu } from '/@/api/system/system'; | 40 | import { saveOrUpdateRoleInfoWithMenu } from '/@/api/system/system'; |
@@ -43,7 +43,7 @@ | @@ -43,7 +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 | + import { useRole } from '/@/hooks/business/useRole'; |
47 | 47 | ||
48 | type TreeData = MenuRecord & TreeItem; | 48 | type TreeData = MenuRecord & TreeItem; |
49 | 49 | ||
@@ -77,7 +77,7 @@ | @@ -77,7 +77,7 @@ | ||
77 | }); | 77 | }); |
78 | }; | 78 | }; |
79 | 79 | ||
80 | - const userStore = useUserStore(); | 80 | + const { isPlatformAdmin } = useRole(); |
81 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | 81 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
82 | allCheckedKeys.value = []; | 82 | allCheckedKeys.value = []; |
83 | resetFields(); | 83 | resetFields(); |
@@ -85,18 +85,16 @@ | @@ -85,18 +85,16 @@ | ||
85 | // 在打开弹窗时清除所有选择的菜单 | 85 | // 在打开弹窗时清除所有选择的菜单 |
86 | treeRef.value && treeRef.value?.setCheckedKeys([]); | 86 | treeRef.value && treeRef.value?.setCheckedKeys([]); |
87 | isUpdate.value = data.isUpdate; | 87 | isUpdate.value = data.isUpdate; |
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 | - } | 88 | + const roleType = RoleEnum.TENANT_ADMIN; |
93 | try { | 89 | try { |
94 | spinning.value = true; | 90 | spinning.value = true; |
95 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 | 91 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 |
96 | 92 | ||
97 | if (!unref(treeData).length) { | 93 | if (!unref(treeData).length) { |
98 | // 获取全部的菜单 | 94 | // 获取全部的菜单 |
99 | - const menuListModel = await getMenuList(); | 95 | + const menuListModel = unref(isPlatformAdmin) |
96 | + ? await getAdminMenuList() | ||
97 | + : await getMenuList(); | ||
100 | treeData.value = transformName(menuListModel as unknown as TreeData[]); | 98 | treeData.value = transformName(menuListModel as unknown as TreeData[]); |
101 | } | 99 | } |
102 | const keys = await getPermissionByRole(roleType); | 100 | const keys = await getPermissionByRole(roleType); |