在大多数SAAS系统中。都提供【版本】这个概念。不同的版本提供不同的功能特性。通过这种方式,一个SAAS系统可以提供不同的价格与功能组合给不同的租户。
例如【标准版】含有A/B/C三个功能,售价1000元;【旗舰版】包含A/B/C/D四个功能,售价2000元。
ABP内置了特性(功能)模块以简化此类功能开发。您可以定义各种特性(功能),检测某个指定特性(功能)是否对某个指定租户开放,或者根据后台设置的特性(功能)开放对应的页面或是生成对应的导航。
在一个SAAS系统中,使用不同功能版本的租户应该看到不同的导航菜单。例如在一个OA系统中,旗舰版的用户有人事管理、财务管理、行政管理、知识管理四个导航菜单。但标准版则没有知识管理这个导航菜单。即使用户通过在地址栏直接输入知识管理对应的url地址,系统也应该给与明确的错误提示:您的版本为开通此功能,如有需要,请联系...,而不应该不做任何验证直接使用该功能。在ABP的架构设计中,特性和版本是直接关联的,您可以通过检测当前用户所属的租户对应的版本是否开通了当前操作对应的功能以确定是否对用户开放当前操作。
话不多说直接上代码:
第一步AppFeatureProvider建立Feature
//控制Feature defaultValue 菜单默认值
chatFeature.CreateChildFeature(
AppFeatures.EnterpriseFeature,
defaultValue: "false",
displayName: L("EnterpriseFeature"),
inputType: new CheckboxInputType()
);
chatFeature.CreateChildFeature(
AppFeatures.EnterpriseBFeature,
defaultValue: "false",
displayName: L("EnterpriseBFeature"),
inputType: new CheckboxInputType()
);
第二步权限导航:
AppAuthorizationProvider
//第一个Feature
var Enterprise = pages.CreateChildPermission(AppPermissions.Pages_Enterprise, L("Enterprise"),
multiTenancySides: MultiTenancySides.Tenant,
featureDependency: new SimpleFeatureDependency(true, AppFeatures.EnterpriseFeature));
Enterprise.CreateChildPermission(AppPermissions.Pages_EnterpriseA, L("EnterpriseA"),
multiTenancySides: MultiTenancySides.Tenant,
featureDependency: new SimpleFeatureDependency(true, AppFeatures.EnterpriseFeature));
//第二个Feature
var EnterpriseB = pages.CreateChildPermission(AppPermissions.Pages_EnterpriseB, L("EnterpriseB"), multiTenancySides: MultiTenancySides.Tenant,
featureDependency: new SimpleFeatureDependency(true, AppFeatures.EnterpriseBFeature));
EnterpriseB.CreateChildPermission(AppPermissions.Pages_EnterpriseC, L("EnterpriseC"), multiTenancySides: MultiTenancySides.Tenant,
featureDependency: new SimpleFeatureDependency(true, AppFeatures.EnterpriseBFeature));
第三步:导航 (注意 这里分为MAP和SPA 在这里被坑过)
MpaNavigationProvider 多页、AppNavigationProvider单页
//第一个Feature
.AddItem(new MenuItemDefinition(
PageNames.App.Host.Enterprise,
L("EnterpriseModel"),
icon: "icon-grid",
requiredPermissionName: AppPermissions.Pages_Enterprise,
requiresAuthentication: true,
featureDependency: new SimpleFeatureDependency(true, AppFeatures.EnterpriseFeature)
).AddItem(new MenuItemDefinition(
PageNames.App.Host.EnterpriseA,
L("EnterpriseA"),
icon: "icon-grid",
url: "",
requiresAuthentication: true,
requiredPermissionName: AppPermissions.Pages_EnterpriseA,
featureDependency: new SimpleFeatureDependency(true, AppFeatures.EnterpriseFeature)
))
)
//第二个Feature
.AddItem(new MenuItemDefinition(
PageNames.App.Host.EnterpriseB,
L("EnterpriseAModel"),
icon: "icon-grid",
requiresAuthentication: true,
requiredPermissionName: AppPermissions.Pages_EnterpriseB,
featureDependency: new SimpleFeatureDependency(true, AppFeatures.EnterpriseBFeature)
).AddItem(new MenuItemDefinition(
PageNames.App.Host.EnterpriseC,
L("EnterpriseC"),
icon: "icon-grid",
url: "",
requiresAuthentication: true,
requiredPermissionName: AppPermissions.Pages_EnterpriseC,
featureDependency: new SimpleFeatureDependency(true, AppFeatures.EnterpriseBFeature)
))
)
到这里后台代码已经完成、 在页面上的操作就不写下来了,相信大家都会。