From c1fb38a9c909acd9d61bc023bd01438ff8e977f0 Mon Sep 17 00:00:00 2001 From: colin Date: Sat, 26 Apr 2025 10:37:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(vben5):=20=E5=AE=9E=E7=8E=B0=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E8=8F=9C=E5=8D=95=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app-antd/src/adapter/component/index.ts | 3 + .../vben5/packages/@abp/identity/package.json | 1 + .../src/components/roles/RoleTable.vue | 14 +- .../packages/@abp/platform/src/api/index.ts | 2 + .../@abp/platform/src/api/useRoleMenusApi.ts | 50 ++++ .../@abp/platform/src/api/useUserMenusApi.ts | 50 ++++ .../@abp/platform/src/components/index.ts | 1 + .../src/components/menus/MenuAllotModal.vue | 216 ++++++++++++++++++ .../platform/src/components/menus/types.ts | 3 + .../packages/@abp/platform/src/types/menus.ts | 52 ++++- 10 files changed, 389 insertions(+), 3 deletions(-) create mode 100644 apps/vben5/packages/@abp/platform/src/api/useRoleMenusApi.ts create mode 100644 apps/vben5/packages/@abp/platform/src/api/useUserMenusApi.ts create mode 100644 apps/vben5/packages/@abp/platform/src/components/menus/MenuAllotModal.vue create mode 100644 apps/vben5/packages/@abp/platform/src/components/menus/types.ts diff --git a/apps/vben5/apps/app-antd/src/adapter/component/index.ts b/apps/vben5/apps/app-antd/src/adapter/component/index.ts index 87cd87bdf..db70ef19d 100644 --- a/apps/vben5/apps/app-antd/src/adapter/component/index.ts +++ b/apps/vben5/apps/app-antd/src/adapter/component/index.ts @@ -38,6 +38,7 @@ import { Switch, Textarea, TimePicker, + Tree, TreeSelect, Upload, } from 'ant-design-vue'; @@ -78,6 +79,7 @@ export type ComponentType = | 'Switch' | 'Textarea' | 'TimePicker' + | 'Tree' | 'TreeSelect' | 'Upload' | BaseFormComponentType; @@ -154,6 +156,7 @@ async function initComponentAdapter() { Switch, Textarea: withDefaultPlaceholder(Textarea, 'input'), TimePicker, + Tree, TreeSelect: withDefaultPlaceholder(TreeSelect, 'select'), Upload, FeatureStateCheck, diff --git a/apps/vben5/packages/@abp/identity/package.json b/apps/vben5/packages/@abp/identity/package.json index c047d3c47..120b9d9b5 100644 --- a/apps/vben5/packages/@abp/identity/package.json +++ b/apps/vben5/packages/@abp/identity/package.json @@ -24,6 +24,7 @@ "@abp/core": "workspace:*", "@abp/data-protection": "workspace:*", "@abp/permissions": "workspace:*", + "@abp/platform": "workspace:*", "@abp/request": "workspace:*", "@abp/ui": "workspace:*", "@ant-design/icons-vue": "catalog:", diff --git a/apps/vben5/packages/@abp/identity/src/components/roles/RoleTable.vue b/apps/vben5/packages/@abp/identity/src/components/roles/RoleTable.vue index dca4c445d..1bc0d6eaf 100644 --- a/apps/vben5/packages/@abp/identity/src/components/roles/RoleTable.vue +++ b/apps/vben5/packages/@abp/identity/src/components/roles/RoleTable.vue @@ -16,6 +16,7 @@ import { $t } from '@vben/locales'; import { AuditLogPermissions, EntityChangeDrawer } from '@abp/auditing'; import { Events, useAbpStore, useEventBus, useFeatures } from '@abp/core'; import { PermissionModal } from '@abp/permissions'; +import { MenuAllotModal } from '@abp/platform'; import { useVbenVxeGrid } from '@abp/ui'; import { DeleteOutlined, @@ -53,6 +54,9 @@ const [RolePermissionModal, permissionModalApi] = useVbenModal({ const [RoleClaimModal, claimModalApi] = useVbenModal({ connectedComponent: ClaimModal, }); +const [RoleMenuModal, menuModalApi] = useVbenModal({ + connectedComponent: MenuAllotModal, +}); const [RoleRuleDrawer, roleRuleDrawerApi] = useVbenDrawer({ connectedComponent: RuleModal, }); @@ -178,13 +182,18 @@ const handleMenuClick = async (row: IdentityRoleDto, info: MenuInfo) => { roleRuleDrawerApi.open(); break; } + case 'menus': { + menuModalApi.setData({ + identity: row.name, + }); + menuModalApi.open(); + break; + } case 'permissions': { - const roles = abpStore.application?.currentUser.roles ?? []; permissionModalApi.setData({ displayName: row.name, providerKey: row.name, providerName: 'R', - readonly: roles.includes(row.name), }); permissionModalApi.open(); break; @@ -296,6 +305,7 @@ function onPermissionChange(_name: string, key: string) { + diff --git a/apps/vben5/packages/@abp/platform/src/api/index.ts b/apps/vben5/packages/@abp/platform/src/api/index.ts index eff247232..b767b6f8e 100644 --- a/apps/vben5/packages/@abp/platform/src/api/index.ts +++ b/apps/vben5/packages/@abp/platform/src/api/index.ts @@ -2,4 +2,6 @@ export { useDataDictionariesApi } from './useDataDictionariesApi'; export { useEmailMessagesApi } from './useEmailMessagesApi'; export { useLayoutsApi } from './useLayoutsApi'; export { useMenusApi } from './useMenusApi'; +export { useRoleMenusApi } from './useRoleMenusApi'; export { useSmsMessagesApi } from './useSmsMessagesApi'; +export { useUserMenusApi } from './useUserMenusApi'; diff --git a/apps/vben5/packages/@abp/platform/src/api/useRoleMenusApi.ts b/apps/vben5/packages/@abp/platform/src/api/useRoleMenusApi.ts new file mode 100644 index 000000000..b7e076a43 --- /dev/null +++ b/apps/vben5/packages/@abp/platform/src/api/useRoleMenusApi.ts @@ -0,0 +1,50 @@ +import type { ListResultDto } from '@abp/core'; + +import type { + MenuDto, + MenuGetByRoleInput, + SetRoleMenuInput, + SetRoleMenuStartupInput, +} from '../types/menus'; + +import { useRequest } from '@abp/request'; + +export function useRoleMenusApi() { + const { cancel, request } = useRequest(); + + function getAllApi( + input: MenuGetByRoleInput, + ): Promise> { + return request>( + `/api/platform/menus/by-role/${input.role}/${input.framework}`, + { + method: 'GET', + params: input, + }, + ); + } + + function setMenusApi(input: SetRoleMenuInput): Promise { + return request('/api/platform/menus/by-role', { + data: input, + method: 'PUT', + }); + } + + function setStartupMenuApi( + meudId: string, + input: SetRoleMenuStartupInput, + ): Promise { + return request(`/api/platform/menus/startup/${meudId}/by-role`, { + data: input, + method: 'PUT', + }); + } + + return { + cancel, + getAllApi, + setMenusApi, + setStartupMenuApi, + }; +} diff --git a/apps/vben5/packages/@abp/platform/src/api/useUserMenusApi.ts b/apps/vben5/packages/@abp/platform/src/api/useUserMenusApi.ts new file mode 100644 index 000000000..684b311d8 --- /dev/null +++ b/apps/vben5/packages/@abp/platform/src/api/useUserMenusApi.ts @@ -0,0 +1,50 @@ +import type { ListResultDto } from '@abp/core'; + +import type { + MenuDto, + MenuGetByUserInput, + SetUserMenuInput, + SetUserMenuStartupInput, +} from '../types/menus'; + +import { useRequest } from '@abp/request'; + +export function useUserMenusApi() { + const { cancel, request } = useRequest(); + + function getAllApi( + input: MenuGetByUserInput, + ): Promise> { + return request>( + `/api/platform/menus/by-user/${input.userId}/${input.framework}`, + { + method: 'GET', + params: input, + }, + ); + } + + function setMenusApi(input: SetUserMenuInput): Promise { + return request('/api/platform/menus/by-user', { + data: input, + method: 'PUT', + }); + } + + function setStartupMenuApi( + meudId: string, + input: SetUserMenuStartupInput, + ): Promise { + return request(`/api/platform/menus/startup/${meudId}/by-user`, { + data: input, + method: 'PUT', + }); + } + + return { + cancel, + getAllApi, + setMenusApi, + setStartupMenuApi, + }; +} diff --git a/apps/vben5/packages/@abp/platform/src/components/index.ts b/apps/vben5/packages/@abp/platform/src/components/index.ts index 41f432072..1d9a9ddb6 100644 --- a/apps/vben5/packages/@abp/platform/src/components/index.ts +++ b/apps/vben5/packages/@abp/platform/src/components/index.ts @@ -1,5 +1,6 @@ export { default as DataDictionaryTable } from './data-dictionaries/DataDictionaryTable.vue'; export { default as LayoutTable } from './layouts/LayoutTable.vue'; +export { default as MenuAllotModal } from './menus/MenuAllotModal.vue'; export { default as MenuTable } from './menus/MenuTable.vue'; export { default as EmailMessageTable } from './messages/email/EmailMessageTable.vue'; export { default as SmsMessageTable } from './messages/sms/SmsMessageTable.vue'; diff --git a/apps/vben5/packages/@abp/platform/src/components/menus/MenuAllotModal.vue b/apps/vben5/packages/@abp/platform/src/components/menus/MenuAllotModal.vue new file mode 100644 index 000000000..0bd5e7538 --- /dev/null +++ b/apps/vben5/packages/@abp/platform/src/components/menus/MenuAllotModal.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/apps/vben5/packages/@abp/platform/src/components/menus/types.ts b/apps/vben5/packages/@abp/platform/src/components/menus/types.ts new file mode 100644 index 000000000..cce2f28d8 --- /dev/null +++ b/apps/vben5/packages/@abp/platform/src/components/menus/types.ts @@ -0,0 +1,3 @@ +type MenuSubject = 'role' | 'user'; + +export type { MenuSubject }; diff --git a/apps/vben5/packages/@abp/platform/src/types/menus.ts b/apps/vben5/packages/@abp/platform/src/types/menus.ts index b2639e77f..a6b8682b4 100644 --- a/apps/vben5/packages/@abp/platform/src/types/menus.ts +++ b/apps/vben5/packages/@abp/platform/src/types/menus.ts @@ -26,6 +26,44 @@ interface MenuCreateDto extends MenuCreateOrUpdateDto { layoutId: string; } +interface MenuGetInput { + framework?: string; +} + +interface MenuGetByUserInput { + framework: string; + userId: string; +} + +interface MenuGetByRoleInput { + framework: string; + role: string; +} + +interface SetUserMenuInput { + framework?: string; + menuIds: string[]; + startupMenuId?: string; + userId: string; +} + +interface SetUserMenuStartupInput { + framework?: string; + userId: string; +} + +interface SetRoleMenuInput { + framework?: string; + menuIds: string[]; + roleName: string; + startupMenuId?: string; +} + +interface SetRoleMenuStartupInput { + framework?: string; + roleName: string; +} + type MenuUpdateDto = MenuCreateOrUpdateDto; interface MenuGetAllInput { @@ -36,4 +74,16 @@ interface MenuGetAllInput { sorting?: string; } -export type { MenuCreateDto, MenuDto, MenuGetAllInput, MenuUpdateDto }; +export type { + MenuCreateDto, + MenuDto, + MenuGetAllInput, + MenuGetByRoleInput, + MenuGetByUserInput, + MenuGetInput, + MenuUpdateDto, + SetRoleMenuInput, + SetRoleMenuStartupInput, + SetUserMenuInput, + SetUserMenuStartupInput, +};