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 new file mode 100644 index 000000000..c44657431 --- /dev/null +++ b/apps/vben5/packages/@abp/features/package.json @@ -0,0 +1,39 @@ +{ + "name": "@abp/features", + "version": "9.0.4", + "homepage": "https://github.com/colinin/abp-next-admin", + "bugs": "https://github.com/colinin/abp-next-admin/issues", + "repository": { + "type": "git", + "url": "git+https://github.com/colinin/abp-next-admin.git", + "directory": "packages/@abp/features" + }, + "license": "MIT", + "type": "module", + "sideEffects": [ + "**/*.css" + ], + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + } + }, + "dependencies": { + "@abp/core": "workspace:*", + "@abp/request": "workspace:*", + "@abp/ui": "workspace:*", + "@ant-design/icons-vue": "catalog:", + "@vben/access": "workspace:*", + "@vben/common-ui": "workspace:*", + "@vben/hooks": "workspace:*", + "@vben/icons": "workspace:*", + "@vben/locales": "workspace:*", + "@vben/utils": "workspace:*", + "ant-design-vue": "catalog:", + "dayjs": "catalog:", + "vue": "catalog:*", + "vxe-table": "catalog:" + }, + "devDependencies": {} +} diff --git a/apps/vben5/packages/@abp/features/src/api/index.ts b/apps/vben5/packages/@abp/features/src/api/index.ts new file mode 100644 index 000000000..4287d4768 --- /dev/null +++ b/apps/vben5/packages/@abp/features/src/api/index.ts @@ -0,0 +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/api/useFeatureGroupDefinitionsApi.ts b/apps/vben5/packages/@abp/features/src/api/useFeatureGroupDefinitionsApi.ts new file mode 100644 index 000000000..a3f19ef6c --- /dev/null +++ b/apps/vben5/packages/@abp/features/src/api/useFeatureGroupDefinitionsApi.ts @@ -0,0 +1,100 @@ +import type { ListResultDto } from '@abp/core'; + +import type { + FeatureGroupDefinitionCreateDto, + FeatureGroupDefinitionDto, + FeatureGroupDefinitionGetListInput, + FeatureGroupDefinitionUpdateDto, +} from '../types/groups'; + +import { useRequest } from '@abp/request'; + +export function useFeatureGroupDefinitionsApi() { + const { cancel, request } = useRequest(); + + /** + * 删除功能定义 + * @param name 功能名称 + */ + function deleteApi(name: string): Promise { + return request(`/api/feature-management/definitions/groups/${name}`, { + method: 'DELETE', + }); + } + + /** + * 查询功能定义 + * @param name 功能名称 + * @returns 功能定义数据传输对象 + */ + function getApi(name: string): Promise { + return request( + `/api/feature-management/definitions/groups/${name}`, + { + method: 'GET', + }, + ); + } + + /** + * 查询功能定义列表 + * @param input 功能过滤条件 + * @returns 功能定义数据传输对象列表 + */ + function getListApi( + input?: FeatureGroupDefinitionGetListInput, + ): Promise> { + return request>( + `/api/feature-management/definitions/groups`, + { + method: 'GET', + params: input, + }, + ); + } + + /** + * 创建功能定义 + * @param input 功能定义参数 + * @returns 功能定义数据传输对象 + */ + function createApi( + input: FeatureGroupDefinitionCreateDto, + ): Promise { + return request( + '/api/feature-management/definitions/groups', + { + data: input, + method: 'POST', + }, + ); + } + + /** + * 更新功能定义 + * @param name 功能名称 + * @param input 功能定义参数 + * @returns 功能定义数据传输对象 + */ + function updateApi( + name: string, + input: FeatureGroupDefinitionUpdateDto, + ): Promise { + return request( + `/api/feature-management/definitions/groups/${name}`, + { + data: input, + method: 'PUT', + }, + ); + } + + return { + cancel, + createApi, + deleteApi, + getApi, + getListApi, + updateApi, + }; +} diff --git a/apps/vben5/packages/@abp/features/src/api/useFeaturesApi.ts b/apps/vben5/packages/@abp/features/src/api/useFeaturesApi.ts new file mode 100644 index 000000000..116817733 --- /dev/null +++ b/apps/vben5/packages/@abp/features/src/api/useFeaturesApi.ts @@ -0,0 +1,62 @@ +import type { + FeatureProvider, + GetFeatureListResultDto, + UpdateFeaturesDto, +} from '../types/features'; + +import { useRequest } from '@abp/request'; + +export function useFeaturesApi() { + const { cancel, request } = useRequest(); + + /** + * 删除功能 + * @param {FeatureProvider} provider 参数 + * @returns {Promise} + */ + function deleteApi(provider: FeatureProvider): Promise { + return request(`/api/feature-management/features`, { + method: 'DELETE', + params: provider, + }); + } + + /** + * 查询功能 + * @param {FeatureProvider} provider 参数 + * @returns {Promise} 功能实体数据传输对象 + */ + function getApi(provider: FeatureProvider): Promise { + return request( + `/api/feature-management/features`, + { + method: 'GET', + params: provider, + }, + ); + } + + /** + * 更新功能 + * @param {FeatureProvider} provider + * @param {UpdateFeaturesDto} input 参数 + * @returns {Promise} + */ + function updateApi( + provider: FeatureProvider, + input: UpdateFeaturesDto, + ): Promise { + return request(`/api/feature-management/features`, { + data: input, + method: 'PUT', + params: provider, + }); + } + + return { + cancel, + deleteApi, + getApi, + 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 @@ + + +