From bd3cd7ed013cb8f12aee4805a268ca943b23daea Mon Sep 17 00:00:00 2001 From: colin Date: Tue, 11 Mar 2025 10:22:20 +0800 Subject: [PATCH] feat(vben5): manage feature definition --- apps/vben5/apps/app-antd/package.json | 1 + .../app-antd/src/locales/langs/en-US/abp.json | 5 + .../app-antd/src/locales/langs/zh-CN/abp.json | 5 + .../app-antd/src/router/routes/modules/abp.ts | 29 + .../src/views/features/definitions/index.vue | 15 + .../src/views/features/groups/index.vue | 15 + .../@abp/core/src/hooks/useValidation.ts | 8 +- .../packages/@abp/core/src/types/rules.ts | 5 + .../packages/@abp/core/src/utils/index.ts | 1 + .../vben5/packages/@abp/features/package.json | 2 +- .../packages/@abp/features/src/api/index.ts | 2 + .../src/api/useFeatureDefinitionsApi.ts | 100 +++ .../features/FeatureDefinitionModal.vue | 467 +++++++++++ .../features/FeatureDefinitionTable.vue | 346 ++++++++ .../groups/FeatureGroupDefinitionTable.vue | 48 +- .../src/components/features/FeatureModal.vue | 8 +- .../@abp/features/src/components/index.ts | 1 + .../features/src/constants/permissions.ts | 10 + .../@abp/features/src/types/definitions.ts | 47 ++ .../vben5/packages/@abp/gdpr/src/api/index.ts | 2 +- .../packages/@abp/platform/src/api/index.ts | 4 +- .../src/components/tenants/TenantModal.vue | 14 +- .../packages/@abp/ui/src/components/index.ts | 1 + .../StringValueTypeInput.vue | 765 ++++++++++++++++++ .../src/components/string-value-type/index.ts | 4 + .../components/string-value-type/interface.ts | 3 + .../components/string-value-type/validator.ts | 143 ++++ .../components/string-value-type/valueType.ts | 120 +++ 28 files changed, 2155 insertions(+), 16 deletions(-) create mode 100644 apps/vben5/apps/app-antd/src/views/features/definitions/index.vue create mode 100644 apps/vben5/apps/app-antd/src/views/features/groups/index.vue create mode 100644 apps/vben5/packages/@abp/features/src/api/useFeatureDefinitionsApi.ts create mode 100644 apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionModal.vue create mode 100644 apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionTable.vue create mode 100644 apps/vben5/packages/@abp/ui/src/components/string-value-type/StringValueTypeInput.vue create mode 100644 apps/vben5/packages/@abp/ui/src/components/string-value-type/index.ts create mode 100644 apps/vben5/packages/@abp/ui/src/components/string-value-type/interface.ts create mode 100644 apps/vben5/packages/@abp/ui/src/components/string-value-type/validator.ts create mode 100644 apps/vben5/packages/@abp/ui/src/components/string-value-type/valueType.ts diff --git a/apps/vben5/apps/app-antd/package.json b/apps/vben5/apps/app-antd/package.json index be1116864..adfaf25a1 100644 --- a/apps/vben5/apps/app-antd/package.json +++ b/apps/vben5/apps/app-antd/package.json @@ -29,6 +29,7 @@ "@abp/account": "workspace:*", "@abp/auditing": "workspace:*", "@abp/core": "workspace:*", + "@abp/features": "workspace:*", "@abp/identity": "workspace:*", "@abp/notifications": "workspace:*", "@abp/openiddict": "workspace:*", diff --git a/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json b/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json index af1be1952..b5b1400f0 100644 --- a/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json +++ b/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json @@ -30,6 +30,11 @@ "groups": "Groups", "definitions": "Definitions" }, + "features": { + "title": "Features", + "groups": "Groups", + "definitions": "Definitions" + }, "settings": { "title": "Settings", "definitions": "Definitions", diff --git a/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json b/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json index 1c4595dbb..6cc746f9c 100644 --- a/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json +++ b/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json @@ -30,6 +30,11 @@ "groups": "权限分组", "definitions": "权限定义" }, + "features": { + "title": "功能管理", + "groups": "功能分组", + "definitions": "功能定义" + }, "settings": { "title": "设置管理", "definitions": "设置定义", diff --git a/apps/vben5/apps/app-antd/src/router/routes/modules/abp.ts b/apps/vben5/apps/app-antd/src/router/routes/modules/abp.ts index f737035c3..b0c6ea5fc 100644 --- a/apps/vben5/apps/app-antd/src/router/routes/modules/abp.ts +++ b/apps/vben5/apps/app-antd/src/router/routes/modules/abp.ts @@ -117,6 +117,35 @@ const routes: RouteRecordRaw[] = [ }, ], }, + { + meta: { + title: $t('abp.manage.features.title'), + icon: 'ant-design:gold-outlined', + }, + name: 'FeatureManagement', + path: '/manage/features', + children: [ + { + meta: { + title: $t('abp.manage.features.groups'), + icon: 'lucide:group', + }, + name: 'FeatureGroupDefinitions', + path: '/manage/features/groups', + component: () => import('#/views/features/groups/index.vue'), + }, + { + meta: { + title: $t('abp.manage.features.definitions'), + icon: 'pajamas:feature-flag', + }, + name: 'FeatureDefinitions', + path: '/manage/features/definitions', + component: () => + import('#/views/features/definitions/index.vue'), + }, + ], + }, { meta: { title: $t('abp.manage.settings.title'), diff --git a/apps/vben5/apps/app-antd/src/views/features/definitions/index.vue b/apps/vben5/apps/app-antd/src/views/features/definitions/index.vue new file mode 100644 index 000000000..637b08c87 --- /dev/null +++ b/apps/vben5/apps/app-antd/src/views/features/definitions/index.vue @@ -0,0 +1,15 @@ + + + diff --git a/apps/vben5/apps/app-antd/src/views/features/groups/index.vue b/apps/vben5/apps/app-antd/src/views/features/groups/index.vue new file mode 100644 index 000000000..caa12d1e8 --- /dev/null +++ b/apps/vben5/apps/app-antd/src/views/features/groups/index.vue @@ -0,0 +1,15 @@ + + + diff --git a/apps/vben5/packages/@abp/core/src/hooks/useValidation.ts b/apps/vben5/packages/@abp/core/src/hooks/useValidation.ts index afb24569e..4e18afba0 100644 --- a/apps/vben5/packages/@abp/core/src/hooks/useValidation.ts +++ b/apps/vben5/packages/@abp/core/src/hooks/useValidation.ts @@ -129,7 +129,7 @@ export function useValidation(): RuleCreator { required?: boolean, ): Rule { const message = field.name - ? L(useNameEnum, [_getFieldName(field), field.minimum, field.maximum]) + ? L(useNameEnum, [_getFieldName(field), field.maximum, field.minimum]) : L(notNameEnum, [field.minimum, field.maximum]); return { message, @@ -397,6 +397,12 @@ export function useValidation(): RuleCreator { ), ]; }, + mapEnumValidMessage( + enumName: string, + args?: any[] | Record | undefined, + ) { + return L(enumName, args); + }, }; return ruleCreator; diff --git a/apps/vben5/packages/@abp/core/src/types/rules.ts b/apps/vben5/packages/@abp/core/src/types/rules.ts index aef6ed573..3737cc5fb 100644 --- a/apps/vben5/packages/@abp/core/src/types/rules.ts +++ b/apps/vben5/packages/@abp/core/src/types/rules.ts @@ -45,6 +45,11 @@ interface RuleCreator { fieldOnlyAcceptsFilesExtensions(field: FieldContains): Rule[]; /** 字段{0}不可为空 */ fieldRequired(field: Field): Rule[]; + /** 获取一个错误枚举验证消息 */ + mapEnumValidMessage( + enumName: string, + args?: any[] | Record | undefined, + ): string; } export type { RuleCreator }; diff --git a/apps/vben5/packages/@abp/core/src/utils/index.ts b/apps/vben5/packages/@abp/core/src/utils/index.ts index 2109114a1..1219f2544 100644 --- a/apps/vben5/packages/@abp/core/src/utils/index.ts +++ b/apps/vben5/packages/@abp/core/src/utils/index.ts @@ -1,4 +1,5 @@ export * from './date'; +export * from './is'; export * from './mitt'; export * from './regex'; export * from './string'; diff --git a/apps/vben5/packages/@abp/features/package.json b/apps/vben5/packages/@abp/features/package.json index 67751a202..c44657431 100644 --- a/apps/vben5/packages/@abp/features/package.json +++ b/apps/vben5/packages/@abp/features/package.json @@ -20,7 +20,6 @@ } }, "dependencies": { - "@abp/auditing": "workspace:*", "@abp/core": "workspace:*", "@abp/request": "workspace:*", "@abp/ui": "workspace:*", @@ -30,6 +29,7 @@ "@vben/hooks": "workspace:*", "@vben/icons": "workspace:*", "@vben/locales": "workspace:*", + "@vben/utils": "workspace:*", "ant-design-vue": "catalog:", "dayjs": "catalog:", "vue": "catalog:*", diff --git a/apps/vben5/packages/@abp/features/src/api/index.ts b/apps/vben5/packages/@abp/features/src/api/index.ts index 0d11e3ec4..4287d4768 100644 --- a/apps/vben5/packages/@abp/features/src/api/index.ts +++ b/apps/vben5/packages/@abp/features/src/api/index.ts @@ -1 +1,3 @@ +export { useFeatureDefinitionsApi } from './useFeatureDefinitionsApi'; +export { useFeatureGroupDefinitionsApi } from './useFeatureGroupDefinitionsApi'; export { useFeaturesApi } from './useFeaturesApi'; diff --git a/apps/vben5/packages/@abp/features/src/api/useFeatureDefinitionsApi.ts b/apps/vben5/packages/@abp/features/src/api/useFeatureDefinitionsApi.ts new file mode 100644 index 000000000..165af3aff --- /dev/null +++ b/apps/vben5/packages/@abp/features/src/api/useFeatureDefinitionsApi.ts @@ -0,0 +1,100 @@ +import type { ListResultDto } from '@abp/core'; + +import type { + FeatureDefinitionCreateDto, + FeatureDefinitionDto, + FeatureDefinitionGetListInput, + FeatureDefinitionUpdateDto, +} from '../types/definitions'; + +import { useRequest } from '@abp/request'; + +export function useFeatureDefinitionsApi() { + const { cancel, request } = useRequest(); + + /** + * 删除功能定义 + * @param name 功能名称 + */ + function deleteApi(name: string): Promise { + return request(`/api/feature-management/definitions/${name}`, { + method: 'DELETE', + }); + } + + /** + * 查询功能定义 + * @param name 功能名称 + * @returns 功能定义数据传输对象 + */ + function getApi(name: string): Promise { + return request( + `/api/feature-management/definitions/${name}`, + { + method: 'GET', + }, + ); + } + + /** + * 查询功能定义列表 + * @param input 功能过滤条件 + * @returns 功能定义数据传输对象列表 + */ + function getListApi( + input?: FeatureDefinitionGetListInput, + ): Promise> { + return request>( + `/api/feature-management/definitions`, + { + method: 'GET', + params: input, + }, + ); + } + + /** + * 创建功能定义 + * @param input 功能定义参数 + * @returns 功能定义数据传输对象 + */ + function createApi( + input: FeatureDefinitionCreateDto, + ): Promise { + return request( + '/api/feature-management/definitions', + { + data: input, + method: 'POST', + }, + ); + } + + /** + * 更新功能定义 + * @param name 功能名称 + * @param input 功能定义参数 + * @returns 功能定义数据传输对象 + */ + function updateApi( + name: string, + input: FeatureDefinitionUpdateDto, + ): Promise { + return request( + `/api/feature-management/definitions/${name}`, + { + data: input, + method: 'PUT', + }, + ); + } + + return { + cancel, + createApi, + deleteApi, + getApi, + getListApi, + updateApi, + }; +} diff --git a/apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionModal.vue b/apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionModal.vue new file mode 100644 index 000000000..4b812dfa3 --- /dev/null +++ b/apps/vben5/packages/@abp/features/src/components/definitions/features/FeatureDefinitionModal.vue @@ -0,0 +1,467 @@ + + +