Commit 4488b4c2031c3a088dbb36e47f2783e61bd116cb
Merge branch 'ww' into 'main_dev'
fix: 修复bug See merge request yunteng/thingskit-front!560
Showing
13 changed files
with
164 additions
and
67 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 }); |
| @@ -31,6 +31,6 @@ | @@ -31,6 +31,6 @@ | ||
| 31 | <Icon | 31 | <Icon |
| 32 | v-bind="getBindProps" | 32 | v-bind="getBindProps" |
| 33 | class="justify-center items-center" | 33 | class="justify-center items-center" |
| 34 | - :class="getHasPermission ? '' : '!cursor-not-allowed !text-gray-200'" | 34 | + :class="getHasPermission ? '' : '!cursor-not-allowed !text-gray-200 !dark:text-gray-700'" |
| 35 | /> | 35 | /> |
| 36 | </template> | 36 | </template> |
| @@ -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 | +}; |
| @@ -29,11 +29,14 @@ | @@ -29,11 +29,14 @@ | ||
| 29 | import { useModal } from '/@/components/Modal'; | 29 | import { useModal } from '/@/components/Modal'; |
| 30 | import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard'; | 30 | import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard'; |
| 31 | import { ViewType } from '../../visual/board/config/panelDetail'; | 31 | import { ViewType } from '../../visual/board/config/panelDetail'; |
| 32 | + import { useRole } from '/@/hooks/business/useRole'; | ||
| 32 | 33 | ||
| 33 | const listColumn = ref(5); | 34 | const listColumn = ref(5); |
| 34 | 35 | ||
| 35 | const { createMessage } = useMessage(); | 36 | const { createMessage } = useMessage(); |
| 36 | 37 | ||
| 38 | + const { isCustomerUser } = useRole(); | ||
| 39 | + | ||
| 37 | const organizationId = ref<Nullable<number>>(null); | 40 | const organizationId = ref<Nullable<number>>(null); |
| 38 | 41 | ||
| 39 | const pagination = reactive<PaginationProps>({ | 42 | const pagination = reactive<PaginationProps>({ |
| @@ -219,7 +222,7 @@ | @@ -219,7 +222,7 @@ | ||
| 219 | > | 222 | > |
| 220 | <template #header> | 223 | <template #header> |
| 221 | <div class="flex gap-3 justify-end"> | 224 | <div class="flex gap-3 justify-end"> |
| 222 | - <Authority :value="ConfigurationPermission.CREATE"> | 225 | + <Authority v-if="!isCustomerUser" :value="ConfigurationPermission.CREATE"> |
| 223 | <Button type="primary" @click="handleCreateOrUpdate()">新增组态</Button> | 226 | <Button type="primary" @click="handleCreateOrUpdate()">新增组态</Button> |
| 224 | </Authority> | 227 | </Authority> |
| 225 | <CardLayoutButton v-model:value="listColumn" @change="handleCardLayoutChange" /> | 228 | <CardLayoutButton v-model:value="listColumn" @change="handleCardLayoutChange" /> |
| @@ -265,7 +268,7 @@ | @@ -265,7 +268,7 @@ | ||
| 265 | @click="handlePreview(item)" | 268 | @click="handlePreview(item)" |
| 266 | /> | 269 | /> |
| 267 | </Tooltip> | 270 | </Tooltip> |
| 268 | - <Tooltip title="设计"> | 271 | + <Tooltip v-if="!isCustomerUser" title="设计"> |
| 269 | <AuthIcon | 272 | <AuthIcon |
| 270 | :auth="ConfigurationPermission.DESIGN" | 273 | :auth="ConfigurationPermission.DESIGN" |
| 271 | class="!text-lg" | 274 | class="!text-lg" |
| @@ -283,6 +286,7 @@ | @@ -283,6 +286,7 @@ | ||
| 283 | /> | 286 | /> |
| 284 | </Tooltip> | 287 | </Tooltip> |
| 285 | <AuthDropDown | 288 | <AuthDropDown |
| 289 | + v-if="!isCustomerUser" | ||
| 286 | :dropMenuList="[ | 290 | :dropMenuList="[ |
| 287 | { | 291 | { |
| 288 | text: '分享', | 292 | text: '分享', |
| @@ -32,6 +32,7 @@ | @@ -32,6 +32,7 @@ | ||
| 32 | import { ViewType } from '../visual/board/config/panelDetail'; | 32 | import { ViewType } from '../visual/board/config/panelDetail'; |
| 33 | import { useUserStore } from '/@/store/modules/user'; | 33 | import { useUserStore } from '/@/store/modules/user'; |
| 34 | import { RoleEnum } from '/@/enums/roleEnum'; | 34 | import { RoleEnum } from '/@/enums/roleEnum'; |
| 35 | + import { useRole } from '/@/hooks/business/useRole'; | ||
| 35 | 36 | ||
| 36 | const listColumn = ref(5); | 37 | const listColumn = ref(5); |
| 37 | 38 | ||
| @@ -51,6 +52,7 @@ | @@ -51,6 +52,7 @@ | ||
| 51 | }); | 52 | }); |
| 52 | 53 | ||
| 53 | const loading = ref(false); | 54 | const loading = ref(false); |
| 55 | + const { isCustomerUser } = useRole(); | ||
| 54 | 56 | ||
| 55 | const dataSource = ref<BigScreenCenterItemsModel[]>([]); | 57 | const dataSource = ref<BigScreenCenterItemsModel[]>([]); |
| 56 | 58 | ||
| @@ -218,8 +220,8 @@ | @@ -218,8 +220,8 @@ | ||
| 218 | > | 220 | > |
| 219 | <template #header> | 221 | <template #header> |
| 220 | <div class="flex gap-3 justify-end"> | 222 | <div class="flex gap-3 justify-end"> |
| 221 | - <Authority :value="ConfigurationPermission.CREATE"> | ||
| 222 | - <Button type="primary" @click="handleCreateOrUpdate()">新增大屏</Button> | 223 | + <Authority v-if="!isCustomerUser" :value="ConfigurationPermission.CREATE"> |
| 224 | + <Button type="primary" @click="handleCreateOrUpdate()"> 新增大屏 </Button> | ||
| 223 | </Authority> | 225 | </Authority> |
| 224 | <Authority v-if="hasPublicInterfacePermission" :value="ConfigurationPermission.CREATE"> | 226 | <Authority v-if="hasPublicInterfacePermission" :value="ConfigurationPermission.CREATE"> |
| 225 | <Button type="primary" @click="handleCreateOrUpdatePublicApi()">公共接口管理</Button> | 227 | <Button type="primary" @click="handleCreateOrUpdatePublicApi()">公共接口管理</Button> |
| @@ -281,7 +283,7 @@ | @@ -281,7 +283,7 @@ | ||
| 281 | @click="handlePreview(item)" | 283 | @click="handlePreview(item)" |
| 282 | /> | 284 | /> |
| 283 | </Tooltip> | 285 | </Tooltip> |
| 284 | - <Tooltip title="设计"> | 286 | + <Tooltip v-if="!isCustomerUser" title="设计"> |
| 285 | <AuthIcon | 287 | <AuthIcon |
| 286 | :disabled="item.state === 1" | 288 | :disabled="item.state === 1" |
| 287 | icon="ant-design:edit-outlined" | 289 | icon="ant-design:edit-outlined" |
| @@ -298,6 +300,7 @@ | @@ -298,6 +300,7 @@ | ||
| 298 | /> | 300 | /> |
| 299 | </Tooltip> | 301 | </Tooltip> |
| 300 | <AuthDropDown | 302 | <AuthDropDown |
| 303 | + v-if="!isCustomerUser" | ||
| 301 | :dropMenuList="[ | 304 | :dropMenuList="[ |
| 302 | { | 305 | { |
| 303 | text: '分享', | 306 | text: '分享', |
| @@ -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); |
| @@ -12,6 +12,7 @@ | @@ -12,6 +12,7 @@ | ||
| 12 | import { usePermission } from '/@/hooks/web/usePermission'; | 12 | import { usePermission } from '/@/hooks/web/usePermission'; |
| 13 | import { DataSource } from '/@/api/dataBoard/model'; | 13 | import { DataSource } from '/@/api/dataBoard/model'; |
| 14 | import { useRoute } from 'vue-router'; | 14 | import { useRoute } from 'vue-router'; |
| 15 | + import { useRole } from '/@/hooks/business/useRole'; | ||
| 15 | 16 | ||
| 16 | const emit = defineEmits(['action']); | 17 | const emit = defineEmits(['action']); |
| 17 | const props = defineProps<{ | 18 | const props = defineProps<{ |
| @@ -19,6 +20,7 @@ | @@ -19,6 +20,7 @@ | ||
| 19 | record: DataSource[]; | 20 | record: DataSource[]; |
| 20 | panelName?: string; | 21 | panelName?: string; |
| 21 | }>(); | 22 | }>(); |
| 23 | + const { isCustomerUser } = useRole(); | ||
| 22 | const { hasPermission } = usePermission(); | 24 | const { hasPermission } = usePermission(); |
| 23 | const dropMenuList = computed<DropMenu[]>(() => { | 25 | const dropMenuList = computed<DropMenu[]>(() => { |
| 24 | const basicMenu: DropMenu[] = []; | 26 | const basicMenu: DropMenu[] = []; |
| @@ -82,7 +84,7 @@ | @@ -82,7 +84,7 @@ | ||
| 82 | <div class="flex items-center gap-5"> | 84 | <div class="flex items-center gap-5"> |
| 83 | <slot name="moreAction"></slot> | 85 | <slot name="moreAction"></slot> |
| 84 | <Dropdown | 86 | <Dropdown |
| 85 | - v-if="dropMenuList.length" | 87 | + v-if="!isCustomerUser && dropMenuList.length" |
| 86 | :drop-menu-list="dropMenuList" | 88 | :drop-menu-list="dropMenuList" |
| 87 | :trigger="['click']" | 89 | :trigger="['click']" |
| 88 | @menu-event="handleMenuEvent" | 90 | @menu-event="handleMenuEvent" |
| @@ -337,7 +337,7 @@ | @@ -337,7 +337,7 @@ | ||
| 337 | v-for="item in dataSource" | 337 | v-for="item in dataSource" |
| 338 | :data-id="item.id" | 338 | :data-id="item.id" |
| 339 | :key="item.id" | 339 | :key="item.id" |
| 340 | - class="flex bg-neutral-100 dark:text-gray-300 dark:bg-dark-700" | 340 | + class="flex bg-light-50 dark:text-gray-300 dark:bg-dark-700" |
| 341 | > | 341 | > |
| 342 | <div class="w-24 text-right flex justify-end" style="flex: 0 0 96px"> 选择设备 </div> | 342 | <div class="w-24 text-right flex justify-end" style="flex: 0 0 96px"> 选择设备 </div> |
| 343 | <div class="pl-2 flex-auto"> | 343 | <div class="pl-2 flex-auto"> |
| @@ -47,6 +47,7 @@ | @@ -47,6 +47,7 @@ | ||
| 47 | import { useScript } from '/@/hooks/web/useScript'; | 47 | import { useScript } from '/@/hooks/web/useScript'; |
| 48 | import { BAI_DU_MAP_GL_LIB, BAI_DU_MAP_TRACK_ANIMATION } from '/@/utils/fnUtils'; | 48 | import { BAI_DU_MAP_GL_LIB, BAI_DU_MAP_TRACK_ANIMATION } from '/@/utils/fnUtils'; |
| 49 | import { useAppStore } from '/@/store/modules/app'; | 49 | import { useAppStore } from '/@/store/modules/app'; |
| 50 | + import { useRole } from '/@/hooks/business/useRole'; | ||
| 50 | 51 | ||
| 51 | const userStore = useAppStore(); | 52 | const userStore = useAppStore(); |
| 52 | 53 | ||
| @@ -60,6 +61,7 @@ | @@ -60,6 +61,7 @@ | ||
| 60 | 61 | ||
| 61 | const ROUTER = useRouter(); | 62 | const ROUTER = useRouter(); |
| 62 | 63 | ||
| 64 | + const { isCustomerUser } = useRole(); | ||
| 63 | const { toPromise: injectBaiDuMapLib } = useScript({ src: BAI_DU_MAP_GL_LIB }); | 65 | const { toPromise: injectBaiDuMapLib } = useScript({ src: BAI_DU_MAP_GL_LIB }); |
| 64 | const { toPromise: injectBaiDuMapTrackAniMationLib } = useScript({ | 66 | const { toPromise: injectBaiDuMapTrackAniMationLib } = useScript({ |
| 65 | src: BAI_DU_MAP_TRACK_ANIMATION, | 67 | src: BAI_DU_MAP_TRACK_ANIMATION, |
| @@ -400,7 +402,11 @@ | @@ -400,7 +402,11 @@ | ||
| 400 | </template> | 402 | </template> |
| 401 | <template #extra> | 403 | <template #extra> |
| 402 | <Authority :value="VisualComponentPermission.CREATE"> | 404 | <Authority :value="VisualComponentPermission.CREATE"> |
| 403 | - <Button v-if="!getIsSharePage" type="primary" @click="handleOpenCreatePanel"> | 405 | + <Button |
| 406 | + v-if="!getIsSharePage && !isCustomerUser" | ||
| 407 | + type="primary" | ||
| 408 | + @click="handleOpenCreatePanel" | ||
| 409 | + > | ||
| 404 | 创建组件 | 410 | 创建组件 |
| 405 | </Button> | 411 | </Button> |
| 406 | </Authority> | 412 | </Authority> |
| @@ -456,7 +462,7 @@ | @@ -456,7 +462,7 @@ | ||
| 456 | @action="handleMoreAction" | 462 | @action="handleMoreAction" |
| 457 | > | 463 | > |
| 458 | <template #moreAction> | 464 | <template #moreAction> |
| 459 | - <Tooltip title="趋势"> | 465 | + <Tooltip v-if="!isCustomerUser" title="趋势"> |
| 460 | <img | 466 | <img |
| 461 | :src="trendIcon" | 467 | :src="trendIcon" |
| 462 | v-if="!getIsSharePage && hasHistoryTrend(item)" | 468 | v-if="!getIsSharePage && hasHistoryTrend(item)" |
| @@ -24,6 +24,7 @@ | @@ -24,6 +24,7 @@ | ||
| 24 | import { ShareModal } from '/@/views/common/ShareModal'; | 24 | import { ShareModal } from '/@/views/common/ShareModal'; |
| 25 | import { ModalParamsType } from '/#/utils'; | 25 | import { ModalParamsType } from '/#/utils'; |
| 26 | import { DataActionModeEnum } from '/@/enums/toolEnum'; | 26 | import { DataActionModeEnum } from '/@/enums/toolEnum'; |
| 27 | + import { useRole } from '/@/hooks/business/useRole'; | ||
| 27 | 28 | ||
| 28 | const ListItem = List.Item; | 29 | const ListItem = List.Item; |
| 29 | const router = useRouter(); | 30 | const router = useRouter(); |
| @@ -92,6 +93,7 @@ | @@ -92,6 +93,7 @@ | ||
| 92 | unref(clipboardRef) ? createMessage.success('复制成功') : createMessage.error('未找到分享链接'); | 93 | unref(clipboardRef) ? createMessage.success('复制成功') : createMessage.error('未找到分享链接'); |
| 93 | }; | 94 | }; |
| 94 | 95 | ||
| 96 | + const { isCustomerUser } = useRole(); | ||
| 95 | const { hasPermission } = usePermission(); | 97 | const { hasPermission } = usePermission(); |
| 96 | const dropMenuList = computed<DropMenu[]>(() => { | 98 | const dropMenuList = computed<DropMenu[]>(() => { |
| 97 | const hasUpdatePermission = hasPermission(VisualBoardPermission.UPDATE); | 99 | const hasUpdatePermission = hasPermission(VisualBoardPermission.UPDATE); |
| @@ -213,7 +215,9 @@ | @@ -213,7 +215,9 @@ | ||
| 213 | <div class="flex items-center mb-3 bg-light-100 h-78px dark:text-gray-300 dark:bg-dark-900"> | 215 | <div class="flex items-center mb-3 bg-light-100 h-78px dark:text-gray-300 dark:bg-dark-900"> |
| 214 | <div class="text-lg ml-30px mr-9px font-bold">自定义看板</div> | 216 | <div class="text-lg ml-30px mr-9px font-bold">自定义看板</div> |
| 215 | <Authority value="api:yt:data_board:add:post"> | 217 | <Authority value="api:yt:data_board:add:post"> |
| 216 | - <Button type="primary" @click="handleOpenDetailModal">创建看板</Button> | 218 | + <Button v-if="!isCustomerUser" type="primary" @click="handleOpenDetailModal" |
| 219 | + >创建看板</Button | ||
| 220 | + > | ||
| 217 | </Authority> | 221 | </Authority> |
| 218 | </div> | 222 | </div> |
| 219 | <div class="bg-light-100 mb-6 w-full p-3 search-form dark:text-gray-300 dark:bg-dark-900"> | 223 | <div class="bg-light-100 mb-6 w-full p-3 search-form dark:text-gray-300 dark:bg-dark-900"> |
| @@ -235,7 +239,7 @@ | @@ -235,7 +239,7 @@ | ||
| 235 | </template> | 239 | </template> |
| 236 | <template #extra> | 240 | <template #extra> |
| 237 | <Dropdown | 241 | <Dropdown |
| 238 | - v-if="dropMenuList.length" | 242 | + v-if="!isCustomerUser && dropMenuList.length" |
| 239 | :trigger="['click']" | 243 | :trigger="['click']" |
| 240 | @menu-event="(event) => handleMenuEvent(event, item)" | 244 | @menu-event="(event) => handleMenuEvent(event, item)" |
| 241 | :drop-menu-list="dropMenuList" | 245 | :drop-menu-list="dropMenuList" |