diff --git a/apps/vben5/apps/app-antd/package.json b/apps/vben5/apps/app-antd/package.json index e6a986ea1..be1116864 100644 --- a/apps/vben5/apps/app-antd/package.json +++ b/apps/vben5/apps/app-antd/package.json @@ -35,6 +35,7 @@ "@abp/permissions": "workspace:*", "@abp/platform": "workspace:*", "@abp/request": "workspace:*", + "@abp/saas": "workspace:*", "@abp/settings": "workspace:*", "@abp/ui": "workspace:*", "@vben/access": "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 ad3c91b93..16d8c78f7 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 @@ -76,5 +76,10 @@ "email": "Email Messages", "sms": "Sms Messages" } + }, + "saas": { + "title": "Saas", + "editions": "Editions", + "tenants": "Tenants" } } 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 bcf96d391..241a6a2de 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 @@ -76,5 +76,10 @@ "email": "邮件消息", "sms": "短信消息" } + }, + "saas": { + "title": "Saas", + "editions": "版本管理", + "tenants": "租户管理" } } 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 a59ca4255..f737035c3 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 @@ -177,6 +177,34 @@ const routes: RouteRecordRaw[] = [ }, ], }, + { + meta: { + title: $t('abp.saas.title'), + icon: 'ant-design:cloud-server-outlined', + }, + name: 'Saas', + path: '/saas', + children: [ + { + meta: { + title: $t('abp.saas.editions'), + icon: 'icon-park-outline:multi-rectangle', + }, + name: 'SaasEditions', + path: '/saas/editions', + component: () => import('#/views/saas/editions/index.vue'), + }, + { + meta: { + title: $t('abp.saas.tenants'), + icon: 'arcticons:tenantcloud-pro', + }, + name: 'SaasTenants', + path: '/saas/tenants', + component: () => import('#/views/saas/tenants/index.vue'), + }, + ], + }, { meta: { title: $t('abp.openiddict.title'), diff --git a/apps/vben5/apps/app-antd/src/views/saas/editions/index.vue b/apps/vben5/apps/app-antd/src/views/saas/editions/index.vue new file mode 100644 index 000000000..2e186f892 --- /dev/null +++ b/apps/vben5/apps/app-antd/src/views/saas/editions/index.vue @@ -0,0 +1,15 @@ + + + + + + + diff --git a/apps/vben5/apps/app-antd/src/views/saas/tenants/index.vue b/apps/vben5/apps/app-antd/src/views/saas/tenants/index.vue new file mode 100644 index 000000000..0b1ed7445 --- /dev/null +++ b/apps/vben5/apps/app-antd/src/views/saas/tenants/index.vue @@ -0,0 +1,15 @@ + + + + + + + diff --git a/apps/vben5/packages/@abp/core/src/types/dto.ts b/apps/vben5/packages/@abp/core/src/types/dto.ts index 41d17932f..7adcb9e67 100644 --- a/apps/vben5/packages/@abp/core/src/types/dto.ts +++ b/apps/vben5/packages/@abp/core/src/types/dto.ts @@ -1,15 +1,15 @@ -import { - type Clock, - type CurrentCulture, - type CurrentTenant, - type CurrentUser, - type Dictionary, - type ExtraPropertyDictionary, - type IHasExtraProperties, - type LanguageInfo, - type MultiTenancyInfo, - type NameValue, - type TimeZone, +import type { + Clock, + CurrentCulture, + CurrentTenant, + CurrentUser, + Dictionary, + ExtraPropertyDictionary, + IHasExtraProperties, + LanguageInfo, + MultiTenancyInfo, + NameValue, + TimeZone, } from './global'; /** 包装器数据传输对象 */ interface WrapResult { @@ -47,6 +47,7 @@ interface RemoteServiceErrorInfo { } /** 扩展属性数据传输对象 */ interface ExtensibleObject { + [key: string]: any; /** 扩展属性 */ extraProperties: ExtraPropertyDictionary; } @@ -102,7 +103,7 @@ interface FullAuditedEntityWithUserDto deleter: TUserDto; } /** 实体扩展属性数据传输对象 */ -interface ExtensibleEntityDto extends ExtensibleObject, EntityDto {} +interface ExtensibleEntityDto extends EntityDto, ExtensibleObject {} /** 实体新增扩展属性数据传输对象 */ interface ExtensibleCreationAuditedEntityDto extends CreationAuditedEntityDto, @@ -121,12 +122,12 @@ interface ExtensibleAuditedEntityWithUserDto ExtensibleEntityDto {} /** 实体审计全属性扩展数据传输对象 */ interface ExtensibleFullAuditedEntityDto - extends FullAuditedEntityDto, - ExtensibleEntityDto {} + extends ExtensibleEntityDto, + FullAuditedEntityDto {} /** 实体审计用户全属性扩展数据传输对象 */ interface ExtensibleFullAuditedEntityWithUserDto - extends FullAuditedEntityWithUserDto, - ExtensibleEntityDto {} + extends ExtensibleEntityDto, + FullAuditedEntityWithUserDto {} /** 最大请求数据传输对象 */ interface LimitedResultRequestDto { /** 最大返回数据大小 */ @@ -134,8 +135,8 @@ interface LimitedResultRequestDto { } /** 最大请求扩展数据传输对象 */ interface ExtensibleLimitedResultRequestDto - extends LimitedResultRequestDto, - ExtensibleObject {} + extends ExtensibleObject, + LimitedResultRequestDto {} /** 排序请求数据传输对象 */ interface SortedResultRequest { /** 排序字段 @@ -160,8 +161,8 @@ interface PagedAndSortedResultRequestDto SortedResultRequest {} /** 分页排序请求扩展数据传输对象 */ interface ExtensiblePagedAndSortedResultRequestDto - extends PagedAndSortedResultRequestDto, - ExtensibleObject {} + extends ExtensibleObject, + PagedAndSortedResultRequestDto {} /** 列表数据传输对象 */ interface ListResultDto { /** 返回项目列表 */ @@ -169,8 +170,8 @@ interface ListResultDto { } /** 列表扩展数据传输对象 */ interface ExtensibleListResultDto - extends ListResultDto, - ExtensibleObject {} + extends ExtensibleObject, + ListResultDto {} /** 分页列表数据传输对象 */ interface PagedResultDto extends ListResultDto { /** 符合条件的最大数量 */ @@ -178,12 +179,12 @@ interface PagedResultDto extends ListResultDto { } /** 分页列表扩展数据传输对象 */ interface ExtensiblePagedResultDto - extends PagedResultDto, - ExtensibleObject {} + extends ExtensibleObject, + PagedResultDto {} /** 分页列表扩展数据传输对象 */ interface ExtensiblePagedResultRequestDto - extends PagedResultRequestDto, - ExtensibleObject {} + extends ExtensibleObject, + PagedResultRequestDto {} /** 应用程序本地化资源数据传输对象 */ interface ApplicationLocalizationResourceDto { /** 继承资源名称列表 */ diff --git a/apps/vben5/packages/@abp/identity/src/types/users.ts b/apps/vben5/packages/@abp/identity/src/types/users.ts index b0d821947..384666225 100644 --- a/apps/vben5/packages/@abp/identity/src/types/users.ts +++ b/apps/vben5/packages/@abp/identity/src/types/users.ts @@ -45,9 +45,9 @@ interface IdentityUserOrganizationUnitUpdateDto { /** 用户实体数据传输对象 */ interface IdentityUserDto extends FullAuditedEntityDto, - IUser, IHasConcurrencyStamp, - IHasExtraProperties { + IHasExtraProperties, + IUser { [key: string]: any; /** 邮箱已验证 */ emailConfirmed: boolean; @@ -95,8 +95,8 @@ interface UserLookupCountInput { } interface UserLookupSearchInput - extends UserLookupCountInput, - PagedAndSortedResultRequestDto {} + extends PagedAndSortedResultRequestDto, + UserLookupCountInput {} export type { ChangeMyPasswordInput, diff --git a/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue b/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue index b6e38d8c0..334fa4a40 100644 --- a/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue +++ b/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue @@ -1,6 +1,7 @@ + + + + + + + + diff --git a/apps/vben5/packages/@abp/saas/src/components/editions/EditionTable.vue b/apps/vben5/packages/@abp/saas/src/components/editions/EditionTable.vue new file mode 100644 index 000000000..c6930a901 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/components/editions/EditionTable.vue @@ -0,0 +1,215 @@ + + + + + + + {{ $t('AbpSaas.NewEdition') }} + + + + + + {{ $t('AbpUi.Edit') }} + + + {{ $t('AbpUi.Delete') }} + + + + onMenuClick(row, info)"> + + {{ $t('AbpAuditLogging.EntitiesChanged') }} + + + + + + + + + query()" /> + + + + diff --git a/apps/vben5/packages/@abp/saas/src/components/index.ts b/apps/vben5/packages/@abp/saas/src/components/index.ts new file mode 100644 index 000000000..88de3efdf --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/components/index.ts @@ -0,0 +1,2 @@ +export { default as EditionTable } from './editions/EditionTable.vue'; +export { default as TenantTable } from './tenants/TenantTable.vue'; diff --git a/apps/vben5/packages/@abp/saas/src/components/tenants/ConnectionStringModal.vue b/apps/vben5/packages/@abp/saas/src/components/tenants/ConnectionStringModal.vue new file mode 100644 index 000000000..ae17f1c05 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/components/tenants/ConnectionStringModal.vue @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + diff --git a/apps/vben5/packages/@abp/saas/src/components/tenants/ConnectionStringTable.vue b/apps/vben5/packages/@abp/saas/src/components/tenants/ConnectionStringTable.vue new file mode 100644 index 000000000..43385cf6a --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/components/tenants/ConnectionStringTable.vue @@ -0,0 +1,114 @@ + + + + + + + + + {{ $t('AbpUi.Edit') }} + + + + {{ + $t('AbpUi.ItemWillBeDeletedMessageWithFormat', [row.name]) + }} + + + {{ $t('AbpUi.Delete') }} + + + + + + + + + + diff --git a/apps/vben5/packages/@abp/saas/src/components/tenants/ConnectionStringsModal.vue b/apps/vben5/packages/@abp/saas/src/components/tenants/ConnectionStringsModal.vue new file mode 100644 index 000000000..9bb7f3707 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/components/tenants/ConnectionStringsModal.vue @@ -0,0 +1,71 @@ + + + + + + + + + diff --git a/apps/vben5/packages/@abp/saas/src/components/tenants/TenantModal.vue b/apps/vben5/packages/@abp/saas/src/components/tenants/TenantModal.vue new file mode 100644 index 000000000..611f927b0 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/components/tenants/TenantModal.vue @@ -0,0 +1,305 @@ + + + + + + + + {{ $t('AbpSaas.DisplayName:IsActive') }} + + + + + + + + + + onNameChange(e.target.value)" + autocomplete="off" + /> + + + + + + + + + + + + + {{ $t('AbpSaas.DisplayName:UseSharedDatabase') }} + + + + + + + + + + + + + diff --git a/apps/vben5/packages/@abp/saas/src/components/tenants/TenantTable.vue b/apps/vben5/packages/@abp/saas/src/components/tenants/TenantTable.vue new file mode 100644 index 000000000..8f2232c23 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/components/tenants/TenantTable.vue @@ -0,0 +1,258 @@ + + + + + + + {{ $t('AbpSaas.NewTenant') }} + + + + + + + + + + + + {{ $t('AbpUi.Edit') }} + + + {{ $t('AbpUi.Delete') }} + + + + onMenuClick(row, info)"> + + {{ $t('AbpSaas.ConnectionStrings') }} + + + {{ $t('AbpAuditLogging.EntitiesChanged') }} + + + + + + + + + query()" /> + + + + + diff --git a/apps/vben5/packages/@abp/saas/src/constants/index.ts b/apps/vben5/packages/@abp/saas/src/constants/index.ts new file mode 100644 index 000000000..c85954d3e --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/constants/index.ts @@ -0,0 +1 @@ +export * from './permissions'; diff --git a/apps/vben5/packages/@abp/saas/src/constants/permissions.ts b/apps/vben5/packages/@abp/saas/src/constants/permissions.ts new file mode 100644 index 000000000..25cb0cd16 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/constants/permissions.ts @@ -0,0 +1,28 @@ +/** 版本权限 */ +export const EditionsPermissions = { + /** 新增 */ + Create: 'AbpSaas.Editions.Create', + /** 默认 */ + Default: 'AbpSaas.Editions', + /** 删除 */ + Delete: 'AbpSaas.Editions.Delete', + /** 管理功能 */ + ManageFeatures: 'AbpSaas.Editions.ManageFeatures', + /** 更新 */ + Update: 'AbpSaas.Editions.Update', +}; +/** 租户权限 */ +export const TenantsPermissions = { + /** 新增 */ + Create: 'AbpSaas.Tenants.Create', + /** 默认 */ + Default: 'AbpSaas.Tenants', + /** 删除 */ + Delete: 'AbpSaas.Tenants.Delete', + /** 管理连接字符串 */ + ManageConnectionStrings: 'AbpSaas.Tenants.ManageConnectionStrings', + /** 管理功能 */ + ManageFeatures: 'AbpSaas.Tenants.ManageFeatures', + /** 更新 */ + Update: 'AbpSaas.Tenants.Update', +}; diff --git a/apps/vben5/packages/@abp/saas/src/index.ts b/apps/vben5/packages/@abp/saas/src/index.ts new file mode 100644 index 000000000..f43dbaee0 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/index.ts @@ -0,0 +1,4 @@ +export * from './api'; +export * from './components'; +export * from './constants'; +export * from './types'; diff --git a/apps/vben5/packages/@abp/saas/src/types/editions.ts b/apps/vben5/packages/@abp/saas/src/types/editions.ts new file mode 100644 index 000000000..15c43cf0e --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/types/editions.ts @@ -0,0 +1,34 @@ +import type { + ExtensibleAuditedEntityDto, + IHasConcurrencyStamp, + PagedAndSortedResultRequestDto, +} from '@abp/core'; + +interface EditionDto + extends ExtensibleAuditedEntityDto, + IHasConcurrencyStamp { + /** 显示名称 */ + displayName: string; +} + +interface EditionCreateOrUpdateBase { + /** 显示名称 */ + displayName: string; +} + +type EditionCreateDto = EditionCreateOrUpdateBase; + +interface EditionUpdateDto + extends EditionCreateOrUpdateBase, + IHasConcurrencyStamp {} + +interface GetEditionPagedListInput extends PagedAndSortedResultRequestDto { + filter?: string; +} + +export type { + EditionCreateDto, + EditionDto, + EditionUpdateDto, + GetEditionPagedListInput, +}; diff --git a/apps/vben5/packages/@abp/saas/src/types/index.ts b/apps/vben5/packages/@abp/saas/src/types/index.ts new file mode 100644 index 000000000..7227f5ab1 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/types/index.ts @@ -0,0 +1,2 @@ +export * from './editions'; +export * from './tenants'; diff --git a/apps/vben5/packages/@abp/saas/src/types/tenants.ts b/apps/vben5/packages/@abp/saas/src/types/tenants.ts new file mode 100644 index 000000000..ab0fc2518 --- /dev/null +++ b/apps/vben5/packages/@abp/saas/src/types/tenants.ts @@ -0,0 +1,68 @@ +import type { + ExtensibleAuditedEntityDto, + ExtensibleObject, + IHasConcurrencyStamp, + NameValue, + PagedAndSortedResultRequestDto, +} from '@abp/core'; + +type TenantConnectionStringDto = NameValue; + +type TenantConnectionStringSetInput = NameValue; + +interface TenantDto + extends ExtensibleAuditedEntityDto, + IHasConcurrencyStamp { + /** 禁用时间 */ + disableTime?: string; + /** 版本Id */ + editionId?: string; + /** 版本名称 */ + editionName?: string; + /** 启用时间 */ + enableTime?: string; + /** 是否可用 */ + isActive: boolean; + /** 名称 */ + name: string; + /** 名称 */ + normalizedName: string; +} + +interface GetTenantPagedListInput extends PagedAndSortedResultRequestDto { + filter?: string; +} + +interface TenantCreateOrUpdateBase extends ExtensibleObject { + /** 禁用时间 */ + disableTime?: string; + /** 版本Id */ + editionId?: string; + /** 启用时间 */ + enableTime?: string; + /** 是否可用 */ + isActive: boolean; + /** 名称 */ + name: string; +} + +interface TenantCreateDto extends TenantCreateOrUpdateBase { + adminEmailAddress: string; + adminPassword: string; + connectionStrings?: TenantConnectionStringSetInput[]; + defaultConnectionString?: string; + useSharedDatabase: boolean; +} + +interface TenantUpdateDto + extends IHasConcurrencyStamp, + TenantCreateOrUpdateBase {} + +export type { + GetTenantPagedListInput, + TenantConnectionStringDto, + TenantConnectionStringSetInput, + TenantCreateDto, + TenantDto, + TenantUpdateDto, +}; diff --git a/apps/vben5/packages/@abp/saas/tsconfig.json b/apps/vben5/packages/@abp/saas/tsconfig.json new file mode 100644 index 000000000..ce1a891fb --- /dev/null +++ b/apps/vben5/packages/@abp/saas/tsconfig.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vben/tsconfig/web.json", + "include": ["src"], + "exclude": ["node_modules"] +}