diff --git a/apps/vue/src/api/saas/editions.ts b/apps/vue/src/api/saas/editions.ts new file mode 100644 index 000000000..8d4aae1b6 --- /dev/null +++ b/apps/vue/src/api/saas/editions.ts @@ -0,0 +1,50 @@ +import { defAbpHttp } from '/@/utils/http/abp'; +import { + Edition, + EditionCreate, + EditionUpdate, + EditionGetListInput, +} from './model/editionsModel'; +import { format } from '/@/utils/strings'; +import { PagedResultDto } from '../model/baseModel'; + +enum Api { + Create = '/api/saas/editions', + DeleteById = '/api/saas/editions/{id}', + GetById = '/api/saas/editions/{id}', + GetList = '/api/saas/editions', + Update = '/api/saas/editions/{id}', +} + +export const getById = (id: string) => { + return defAbpHttp.get({ + url: format(Api.GetById, { id: id }), + }); +}; + +export const getList = (input: EditionGetListInput) => { + return defAbpHttp.get>({ + url: Api.GetList, + params: input, + }); +}; + +export const create = (input: EditionCreate) => { + return defAbpHttp.post({ + url: Api.Create, + data: input, + }); +}; + +export const deleteById = (id: string) => { + return defAbpHttp.delete({ + url: format(Api.GetById, { id: id }), + }); +}; + +export const update = (id: string, input: EditionUpdate) => { + return defAbpHttp.put({ + url: format(Api.Update, { id: id }), + data: input, + }); +}; diff --git a/apps/vue/src/api/saas/model/editionsModel.ts b/apps/vue/src/api/saas/model/editionsModel.ts new file mode 100644 index 000000000..2001d7299 --- /dev/null +++ b/apps/vue/src/api/saas/model/editionsModel.ts @@ -0,0 +1,23 @@ +import { + IHasConcurrencyStamp, + AuditedEntityDto, + PagedAndSortedResultRequestDto, +} from '../../model/baseModel'; + +export interface Edition extends AuditedEntityDto { + id: string; + displayName: string; +} + +interface EditionCreateOrUpdate { + displayName: string; +} + +export type EditionCreate = EditionCreateOrUpdate; + +export interface EditionUpdate extends EditionCreateOrUpdate, IHasConcurrencyStamp { +} + +export interface EditionGetListInput extends PagedAndSortedResultRequestDto { + filter?: string; +} diff --git a/apps/vue/src/views/saas/editions/components/EditionModal.vue b/apps/vue/src/views/saas/editions/components/EditionModal.vue new file mode 100644 index 000000000..be56eb684 --- /dev/null +++ b/apps/vue/src/views/saas/editions/components/EditionModal.vue @@ -0,0 +1,70 @@ + + + diff --git a/apps/vue/src/views/saas/editions/components/EditionTable.vue b/apps/vue/src/views/saas/editions/components/EditionTable.vue new file mode 100644 index 000000000..a618ac927 --- /dev/null +++ b/apps/vue/src/views/saas/editions/components/EditionTable.vue @@ -0,0 +1,108 @@ + + + diff --git a/apps/vue/src/views/saas/editions/datas/ModalData.ts b/apps/vue/src/views/saas/editions/datas/ModalData.ts new file mode 100644 index 000000000..01e119b45 --- /dev/null +++ b/apps/vue/src/views/saas/editions/datas/ModalData.ts @@ -0,0 +1,44 @@ +import { useLocalization } from '/@/hooks/abp/useLocalization'; +import { FormProps, FormSchema } from '/@/components/Form'; + +const { L } = useLocalization('AbpSaas'); + +export function getSearchFormSchemas(): Partial { + return { + labelWidth: 120, + schemas: [ + { + field: 'filter', + component: 'Input', + label: L('Search'), + colProps: { span: 24 }, + }, + ], + }; +} + +export function getModalFormSchemas(): FormSchema[] { + return [ + { + field: 'id', + component: 'Input', + label: 'id', + show: false, + dynamicDisabled: true, + }, + { + field: 'concurrencyStamp', + component: 'Input', + label: 'concurrencyStamp', + show: false, + dynamicDisabled: true, + }, + { + field: 'displayName', + component: 'Input', + label: L('DisplayName:EditionName'), + colProps: { span: 24 }, + required: true, + }, + ]; +} diff --git a/apps/vue/src/views/saas/editions/datas/TableData.ts b/apps/vue/src/views/saas/editions/datas/TableData.ts new file mode 100644 index 000000000..c0c570f8b --- /dev/null +++ b/apps/vue/src/views/saas/editions/datas/TableData.ts @@ -0,0 +1,22 @@ +import { useLocalization } from '/@/hooks/abp/useLocalization'; +import { BasicColumn } from '/@/components/Table'; + +const { L } = useLocalization('AbpSaas'); + +export function getDataColumns(): BasicColumn[] { + return [ + { + title: 'id', + dataIndex: 'id', + width: 1, + ifShow: false, + }, + { + title: L('DisplayName:EditionName'), + dataIndex: 'displayName', + align: 'left', + width: 'auto', + sorter: true, + }, + ]; +} \ No newline at end of file diff --git a/apps/vue/src/views/saas/editions/hooks/useFeatureModal.ts b/apps/vue/src/views/saas/editions/hooks/useFeatureModal.ts new file mode 100644 index 000000000..3f42c217d --- /dev/null +++ b/apps/vue/src/views/saas/editions/hooks/useFeatureModal.ts @@ -0,0 +1,14 @@ +import { useModal } from '/@/components/Modal'; + +export function useFeatureModal() { + const [registerModal, { openModal }] = useModal(); + + function handleManageFeature(record) { + openModal(true, { providerName: 'E', providerKey: record.id }); + } + + return { + registerModal, + handleManageFeature, + }; +} diff --git a/apps/vue/src/views/saas/editions/index.vue b/apps/vue/src/views/saas/editions/index.vue new file mode 100644 index 000000000..4de13f229 --- /dev/null +++ b/apps/vue/src/views/saas/editions/index.vue @@ -0,0 +1,13 @@ + + + diff --git a/apps/vue/src/views/saas/tenant/datas/ModalData.ts b/apps/vue/src/views/saas/tenant/datas/ModalData.ts index f5ba2717c..a44336188 100644 --- a/apps/vue/src/views/saas/tenant/datas/ModalData.ts +++ b/apps/vue/src/views/saas/tenant/datas/ModalData.ts @@ -24,6 +24,14 @@ export function getModalFormSchemas(): FormSchema[] { component: 'Input', label: 'id', show: false, + dynamicDisabled: true, + }, + { + field: 'concurrencyStamp', + component: 'Input', + label: 'concurrencyStamp', + show: false, + dynamicDisabled: true, }, { field: 'isActive', diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs index 4336dd4d3..d96d063e8 100644 --- a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs +++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs @@ -212,6 +212,14 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin component: "/saas/tenant/index", description: "租户管理", multiTenancySides: MultiTenancySides.Host)); + saas.AddItem( + new ApplicationMenu( + name: "Editions", + displayName: "版本管理", + url: "/saas/editions", + component: "/saas/editions/index", + description: "版本管理", + multiTenancySides: MultiTenancySides.Host)); return new NavigationDefinition(saas); } diff --git a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Editions/Dto/EditionDto.cs b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Editions/Dto/EditionDto.cs index 2b1fea3be..1833e2cfb 100644 --- a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Editions/Dto/EditionDto.cs +++ b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Editions/Dto/EditionDto.cs @@ -1,9 +1,11 @@ using System; using Volo.Abp.Application.Dtos; +using Volo.Abp.Domain.Entities; namespace LINGYUN.Abp.Saas.Editions; -public class EditionDto : ExtensibleFullAuditedEntityDto +public class EditionDto : ExtensibleAuditedEntityDto, IHasConcurrencyStamp { public string DisplayName { get; set; } + public string ConcurrencyStamp { get; set; } } diff --git a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantDto.cs b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantDto.cs index 2e6be3ec3..436469ef5 100644 --- a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantDto.cs +++ b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantDto.cs @@ -1,9 +1,10 @@ using System; using Volo.Abp.Application.Dtos; - +using Volo.Abp.Domain.Entities; + namespace LINGYUN.Abp.Saas.Tenants; -public class TenantDto : ExtensibleFullAuditedEntityDto +public class TenantDto : ExtensibleAuditedEntityDto, IHasConcurrencyStamp { public string Name { get; set; } @@ -16,4 +17,5 @@ public class TenantDto : ExtensibleFullAuditedEntityDto public DateTime? EnableTime { get; set; } public DateTime? DisableTime { get; set; } + public string ConcurrencyStamp { get; set; } } \ No newline at end of file