Browse Source

feat(feature): change functional hierarchy

pull/816/head
cKey 3 years ago
parent
commit
26f9907991
  1. 12
      aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application.Contracts/LINGYUN/Abp/Auditing/Features/AuditingFeatureDefinitionProvider.cs
  2. 2
      aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application.Contracts/LINGYUN/Abp/Auditing/Features/AuditingFeatureNames.cs
  3. 7
      aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application.Contracts/LINGYUN/Abp/Auditing/Localization/Resources/en.json
  4. 7
      aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application.Contracts/LINGYUN/Abp/Auditing/Localization/Resources/zh-Hans.json
  5. 20
      aspnet-core/modules/cloud-tencent/LINGYUN.Abp.Tencent/LINGYUN/Abp/Tencent/Features/TencentCloudFeatureDefinitionProvider.cs
  6. 10
      aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation.Redis/LINGYUN/Abp/Features/LimitValidation/Redis/RedisRequiresLimitFeatureChecker.cs
  7. 1
      aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/LINGYUN.Abp.Features.LimitValidation.csproj
  8. 5
      aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/LINGYUN/Abp/Features/LimitValidation/AbpFeaturesLimitValidationModule.cs
  9. 47
      aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/LINGYUN/Abp/Features/LimitValidation/AbpFeaturesLimitValidationOptions.cs
  10. 8
      aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/LINGYUN/Abp/Features/LimitValidation/RequiresLimitFeatureContext.cs
  11. 2
      aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/README.en.md
  12. 2
      aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/README.md
  13. 5
      aspnet-core/modules/notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/AbpNotificationsDomainModule.cs
  14. 16
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Features/AbpOssManagementFeatureDefinitionProvider.cs
  15. 2
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Features/AbpOssManagementFeatureNames.cs
  16. 72
      aspnet-core/modules/pushplus/LINGYUN.Abp.PushPlus/LINGYUN/Abp/PushPlus/Features/PushPlusFeatureDefinitionProvider.cs
  17. 23
      aspnet-core/modules/wechat/LINGYUN.Abp.WeChat.MiniProgram/LINGYUN/Abp/WeChat/MiniProgram/Features/WeChatMiniProgramFeatureDefinitionProvider.cs
  18. 10
      aspnet-core/modules/wechat/LINGYUN.Abp.WeChat.Official/LINGYUN/Abp/WeChat/Official/Features/WeChatOfficialFeatureDefinitionProvider.cs
  19. 14
      aspnet-core/modules/wx-pusher/LINGYUN.Abp.WxPusher/LINGYUN/Abp/WxPusher/Features/WxPusherFeatureDefinitionProvider.cs

12
aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application.Contracts/LINGYUN/Abp/Auditing/Features/AuditingFeatureDefinitionProvider.cs

@ -13,27 +13,27 @@ namespace LINGYUN.Abp.Auditing.Features
name: AuditingFeatureNames.GroupName, name: AuditingFeatureNames.GroupName,
displayName: L("Features:Auditing")); displayName: L("Features:Auditing"));
var loggingFeature = auditingGroup.AddFeature( var loggingEnableFeature = auditingGroup.AddFeature(
name: AuditingFeatureNames.Logging.Default, name: AuditingFeatureNames.Logging.Enable,
displayName: L("Features:Auditing"), displayName: L("Features:Auditing"),
description: L("Features:Auditing") description: L("Features:AuditingDesc")
); );
loggingFeature.CreateChild( loggingEnableFeature.CreateChild(
name: AuditingFeatureNames.Logging.AuditLog, name: AuditingFeatureNames.Logging.AuditLog,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:DisplayName:AuditLog"), displayName: L("Features:DisplayName:AuditLog"),
description: L("Features:Description:AuditLog"), description: L("Features:Description:AuditLog"),
valueType: new ToggleStringValueType(new BooleanValueValidator()) valueType: new ToggleStringValueType(new BooleanValueValidator())
); );
loggingFeature.CreateChild( loggingEnableFeature.CreateChild(
name: AuditingFeatureNames.Logging.SecurityLog, name: AuditingFeatureNames.Logging.SecurityLog,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:DisplayName:SecurityLog"), displayName: L("Features:DisplayName:SecurityLog"),
description: L("Features:Description:SecurityLog"), description: L("Features:Description:SecurityLog"),
valueType: new ToggleStringValueType(new BooleanValueValidator()) valueType: new ToggleStringValueType(new BooleanValueValidator())
); );
loggingFeature.CreateChild( loggingEnableFeature.CreateChild(
name: AuditingFeatureNames.Logging.SystemLog, name: AuditingFeatureNames.Logging.SystemLog,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:DisplayName:SystemLog"), displayName: L("Features:DisplayName:SystemLog"),

2
aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application.Contracts/LINGYUN/Abp/Auditing/Features/AuditingFeatureNames.cs

@ -7,6 +7,8 @@
{ {
public const string Default = GroupName + ".Logging"; public const string Default = GroupName + ".Logging";
public const string Enable = Default + ".Enable";
public const string AuditLog = Default + ".AuditLog"; public const string AuditLog = Default + ".AuditLog";
public const string SecurityLog = Default + ".SecurityLog"; public const string SecurityLog = Default + ".SecurityLog";

7
aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application.Contracts/LINGYUN/Abp/Auditing/Localization/Resources/en.json

@ -6,12 +6,13 @@
"Permissions:SecurityLog": "Security log", "Permissions:SecurityLog": "Security log",
"Permissions:DeleteLog": "Delete", "Permissions:DeleteLog": "Delete",
"Features:Auditing": "Auditing", "Features:Auditing": "Auditing",
"Features:AuditingDesc": "Enable the auditing function",
"Features:DisplayName:AuditLog": "Audit log", "Features:DisplayName:AuditLog": "Audit log",
"Features:Description:AuditLog": "Whether to enable audit logging", "Features:Description:AuditLog": "Enable audit logging",
"Features:DisplayName:SecurityLog": "Security log", "Features:DisplayName:SecurityLog": "Security log",
"Features:Description:SecurityLog": "Whether to enable security logging", "Features:Description:SecurityLog": "Enable security logging",
"Features:DisplayName:SystemLog": "System log", "Features:DisplayName:SystemLog": "System log",
"Features:Description:SystemLog": "Whether to enable system logging", "Features:Description:SystemLog": "Enable system logging",
"SecurityLog": "Security log", "SecurityLog": "Security log",
"AuditLog": "Audit log", "AuditLog": "Audit log",
"Logging": "System Log", "Logging": "System Log",

7
aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application.Contracts/LINGYUN/Abp/Auditing/Localization/Resources/zh-Hans.json

@ -6,12 +6,13 @@
"Permissions:SecurityLog": "安全日志", "Permissions:SecurityLog": "安全日志",
"Permissions:DeleteLog": "删除日志", "Permissions:DeleteLog": "删除日志",
"Features:Auditing": "内部审计", "Features:Auditing": "内部审计",
"Features:AuditingDesc": "启用内部审计功能",
"Features:DisplayName:AuditLog": "审计日志", "Features:DisplayName:AuditLog": "审计日志",
"Features:Description:AuditLog": "是否启用审计日志功能", "Features:Description:AuditLog": "启用审计日志功能",
"Features:DisplayName:SecurityLog": "安全日志", "Features:DisplayName:SecurityLog": "安全日志",
"Features:Description:SecurityLog": "是否启用安全日志功能", "Features:Description:SecurityLog": "启用安全日志功能",
"Features:DisplayName:SystemLog": "系统日志", "Features:DisplayName:SystemLog": "系统日志",
"Features:Description:SystemLog": "是否启用系统日志功能", "Features:Description:SystemLog": "启用系统日志功能",
"SecurityLog": "安全日志", "SecurityLog": "安全日志",
"AuditLog": "审计日志", "AuditLog": "审计日志",
"Logging": "系统日志", "Logging": "系统日志",

20
aspnet-core/modules/cloud-tencent/LINGYUN.Abp.Tencent/LINGYUN/Abp/Tencent/Features/TencentCloudFeatureDefinitionProvider.cs

@ -9,32 +9,22 @@ namespace LINGYUN.Abp.Tencent.Features
{ {
public override void Define(IFeatureDefinitionContext context) public override void Define(IFeatureDefinitionContext context)
{ {
var group = context.AddGroup(TencentCloudFeatures.GroupName, L("Features:TencentCloud")); var group = context.AddGroup(TencentCloudFeatures.GroupName, L("Features:TencentCloud"));
var sms = group.AddFeature(
name: TencentCloudFeatures.Sms.GroupName,
displayName: L("Features:TencentSms"),
description: L("Features:TencentSms"));
sms.CreateChild( var smsEnableFeature = group.AddFeature(
name: TencentCloudFeatures.Sms.Enable, name: TencentCloudFeatures.Sms.Enable,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:TencentSmsEnable"), displayName: L("Features:TencentSmsEnable"),
description: L("Features:TencentSmsEnable.Desc"), description: L("Features:TencentSmsEnable.Desc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
var blobStoring = group.AddFeature(
name: TencentCloudFeatures.BlobStoring.GroupName,
displayName: L("Features:TencentBlobStoring"),
description: L("Features:TencentBlobStoring"));
blobStoring.CreateChild( var blobStoringEnableFeature = group.AddFeature(
name: TencentCloudFeatures.BlobStoring.Enable, name: TencentCloudFeatures.BlobStoring.Enable,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:TencentBlobStoringEnable"), displayName: L("Features:TencentBlobStoringEnable"),
description: L("Features:TencentBlobStoringEnable.Desc"), description: L("Features:TencentBlobStoringEnable.Desc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
blobStoring.CreateChild( blobStoringEnableFeature.CreateChild(
name: TencentCloudFeatures.BlobStoring.MaximumStreamSize, name: TencentCloudFeatures.BlobStoring.MaximumStreamSize,
defaultValue: "0", defaultValue: "0",
displayName: L("Features:TencentBlobStoringMaximumStreamSize"), displayName: L("Features:TencentBlobStoringMaximumStreamSize"),

10
aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation.Redis/LINGYUN/Abp/Features/LimitValidation/Redis/RedisRequiresLimitFeatureChecker.cs

@ -9,6 +9,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Timing;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.Features.LimitValidation.Redis namespace LINGYUN.Abp.Features.LimitValidation.Redis
@ -26,6 +27,7 @@ namespace LINGYUN.Abp.Features.LimitValidation.Redis
private IDatabaseAsync _redis; private IDatabaseAsync _redis;
private IServer _server; private IServer _server;
private readonly IClock _clock;
private readonly IVirtualFileProvider _virtualFileProvider; private readonly IVirtualFileProvider _virtualFileProvider;
private readonly IRedisLimitFeatureNamingNormalizer _featureNamingNormalizer; private readonly IRedisLimitFeatureNamingNormalizer _featureNamingNormalizer;
private readonly AbpRedisRequiresLimitFeatureOptions _options; private readonly AbpRedisRequiresLimitFeatureOptions _options;
@ -34,6 +36,7 @@ namespace LINGYUN.Abp.Features.LimitValidation.Redis
private readonly SemaphoreSlim _connectionLock = new SemaphoreSlim(initialCount: 1, maxCount: 1); private readonly SemaphoreSlim _connectionLock = new SemaphoreSlim(initialCount: 1, maxCount: 1);
public RedisRequiresLimitFeatureChecker( public RedisRequiresLimitFeatureChecker(
IClock clock,
IVirtualFileProvider virtualFileProvider, IVirtualFileProvider virtualFileProvider,
IRedisLimitFeatureNamingNormalizer featureNamingNormalizer, IRedisLimitFeatureNamingNormalizer featureNamingNormalizer,
IOptions<AbpRedisRequiresLimitFeatureOptions> optionsAccessor) IOptions<AbpRedisRequiresLimitFeatureOptions> optionsAccessor)
@ -44,8 +47,9 @@ namespace LINGYUN.Abp.Features.LimitValidation.Redis
} }
_options = optionsAccessor.Value; _options = optionsAccessor.Value;
_virtualFileProvider = virtualFileProvider; _clock = clock ?? throw new ArgumentNullException(nameof(clock));
_featureNamingNormalizer = featureNamingNormalizer; _virtualFileProvider = virtualFileProvider ?? throw new ArgumentNullException(nameof(virtualFileProvider));
_featureNamingNormalizer = featureNamingNormalizer ?? throw new ArgumentNullException(nameof(featureNamingNormalizer));
_instance = _options.InstanceName ?? string.Empty; _instance = _options.InstanceName ?? string.Empty;
@ -81,7 +85,7 @@ namespace LINGYUN.Abp.Features.LimitValidation.Redis
} }
var keys = new RedisKey[1] { NormalizeKey(context) }; var keys = new RedisKey[1] { NormalizeKey(context) };
var values = new RedisValue[] { context.GetEffectTicks() }; var values = new RedisValue[] { context.GetEffectTicks(_clock.Now) };
var result = await _redis.ScriptEvaluateAsync(luaSha1, keys, values); var result = await _redis.ScriptEvaluateAsync(luaSha1, keys, values);
if (result.Type == ResultType.Error) if (result.Type == ResultType.Error)
{ {

1
aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/LINGYUN.Abp.Features.LimitValidation.csproj

@ -20,6 +20,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Features" Version="$(VoloAbpPackageVersion)" /> <PackageReference Include="Volo.Abp.Features" Version="$(VoloAbpPackageVersion)" />
<PackageReference Include="Volo.Abp.Timing" Version="$(VoloAbpPackageVersion)" />
</ItemGroup> </ItemGroup>
</Project> </Project>

5
aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/LINGYUN/Abp/Features/LimitValidation/AbpFeaturesLimitValidationModule.cs

@ -3,11 +3,14 @@ using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Features; using Volo.Abp.Features;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Timing;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.Features.LimitValidation namespace LINGYUN.Abp.Features.LimitValidation
{ {
[DependsOn(typeof(AbpFeaturesModule))] [DependsOn(
typeof(AbpTimingModule),
typeof(AbpFeaturesModule))]
public class AbpFeaturesLimitValidationModule : AbpModule public class AbpFeaturesLimitValidationModule : AbpModule
{ {
public override void PreConfigureServices(ServiceConfigurationContext context) public override void PreConfigureServices(ServiceConfigurationContext context)

47
aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/LINGYUN/Abp/Features/LimitValidation/AbpFeaturesLimitValidationOptions.cs

@ -7,10 +7,11 @@ namespace LINGYUN.Abp.Features.LimitValidation
{ {
public class AbpFeaturesLimitValidationOptions public class AbpFeaturesLimitValidationOptions
{ {
public IDictionary<LimitPolicy, Func<int, long>> EffectPolicys { get; } public IDictionary<LimitPolicy, Func<DateTime, int, long>> EffectPolicys { get; }
public AbpFeaturesLimitValidationOptions() public AbpFeaturesLimitValidationOptions()
{ {
EffectPolicys = new Dictionary<LimitPolicy, Func<int, long>>(); EffectPolicys = new Dictionary<LimitPolicy, Func<DateTime, int, long>>();
} }
/// <summary> /// <summary>
/// 变更功能限制策略时长计算方法 /// 变更功能限制策略时长计算方法
@ -20,7 +21,7 @@ namespace LINGYUN.Abp.Features.LimitValidation
/// <remarks> /// <remarks>
/// 返回值一定要是秒钟刻度 /// 返回值一定要是秒钟刻度
/// </remarks> /// </remarks>
public void MapEffectPolicy(LimitPolicy policy,[NotNull] Func<int, long> func) public void MapEffectPolicy(LimitPolicy policy,[NotNull] Func<DateTime, int, long> func)
{ {
Check.NotNull(func, nameof(func)); Check.NotNull(func, nameof(func));
@ -36,54 +37,50 @@ namespace LINGYUN.Abp.Features.LimitValidation
internal void MapDefaultEffectPolicys() internal void MapDefaultEffectPolicys()
{ {
MapEffectPolicy(LimitPolicy.Minute, (time) => MapEffectPolicy(LimitPolicy.Minute, (now, tick) =>
{ {
var utcNow = DateTime.UtcNow; return (long)(now.AddMinutes(tick) - now).TotalSeconds;
return (long)(utcNow.AddMinutes(time) - utcNow).TotalSeconds;
}); });
MapEffectPolicy(LimitPolicy.Hours, (time) => MapEffectPolicy(LimitPolicy.Hours, (now, tick) =>
{ {
var utcNow = DateTime.UtcNow; return (long)(now.AddHours(tick) - now).TotalSeconds;
return (long)(utcNow.AddHours(time) - utcNow).TotalSeconds;
}); });
MapEffectPolicy(LimitPolicy.Days, (time) => MapEffectPolicy(LimitPolicy.Days, (now, tick) =>
{ {
// 按天计算应取当天 // 按天计算应取当天
return (long)(DateTime.UtcNow.Date.AddDays(time) - DateTime.UtcNow).TotalSeconds; return (long)(now.Date.AddDays(tick) - DateTime.UtcNow).TotalSeconds;
}); });
MapEffectPolicy(LimitPolicy.Weeks,(time) => MapEffectPolicy(LimitPolicy.Weeks,(now, tick) =>
{ {
// 按周计算应取当周 // 按周计算应取当周
var utcNow = DateTime.UtcNow.Date; var nowDate = now.Date;
var dayOfWeek = (int)utcNow.DayOfWeek - 1; var dayOfWeek = (int)nowDate.DayOfWeek - 1;
if (utcNow.DayOfWeek == DayOfWeek.Sunday) if (nowDate.DayOfWeek == DayOfWeek.Sunday)
{ {
dayOfWeek = 6; dayOfWeek = 6;
} }
var utcOnceDayOfWeek = utcNow.AddDays(-dayOfWeek); var utcOnceDayOfWeek = nowDate.AddDays(-dayOfWeek);
return (long)(utcOnceDayOfWeek.AddDays(time * 7) - DateTime.UtcNow).TotalSeconds; return (long)(utcOnceDayOfWeek.AddDays(tick * 7) - DateTime.UtcNow).TotalSeconds;
}); });
MapEffectPolicy(LimitPolicy.Month, (time) => MapEffectPolicy(LimitPolicy.Month, (now, tick) =>
{ {
// 按月计算应取当月 // 按月计算应取当月
var utcNow = DateTime.UtcNow; var utcOnceDayOfMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 0, 0);
var utcOnceDayOfMonth = new DateTime(utcNow.Year, utcNow.Month, 1, 0, 0, 0, 0);
return (long)(utcOnceDayOfMonth.AddMonths(time) - utcNow).TotalSeconds; return (long)(utcOnceDayOfMonth.AddMonths(tick) - now).TotalSeconds;
}); });
MapEffectPolicy(LimitPolicy.Years, (time) => MapEffectPolicy(LimitPolicy.Years, (now, tick) =>
{ {
// 按年计算应取当年 // 按年计算应取当年
var utcNow = DateTime.UtcNow; var utcOnceDayOfYear = new DateTime(now.Year, 1, 1, 0, 0, 0, 0);
var utcOnceDayOfYear = new DateTime(utcNow.Year, 1, 1, 0, 0, 0, 0);
return (long)(utcOnceDayOfYear.AddYears(time) - utcNow).TotalSeconds; return (long)(utcOnceDayOfYear.AddYears(tick) - now).TotalSeconds;
}); });
} }
} }

8
aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/LINGYUN/Abp/Features/LimitValidation/RequiresLimitFeatureContext.cs

@ -1,4 +1,6 @@
namespace LINGYUN.Abp.Features.LimitValidation using System;
namespace LINGYUN.Abp.Features.LimitValidation
{ {
public class RequiresLimitFeatureContext public class RequiresLimitFeatureContext
{ {
@ -38,9 +40,9 @@
/// 获取生效时间跨度,单位:s /// 获取生效时间跨度,单位:s
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public long GetEffectTicks() public long GetEffectTicks(DateTime now)
{ {
return Options.EffectPolicys[Policy](Interval); return Options.EffectPolicys[Policy](now, Interval);
} }
} }
} }

2
aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/README.en.md

@ -80,7 +80,7 @@ public class YouProjectModule : AbpModule
{ {
Configure<AbpFeaturesLimitValidationOptions>(options => Configure<AbpFeaturesLimitValidationOptions>(options =>
{ {
options.MapEffectPolicy(LimitPolicy.Minute, (time) => return 60;); // Means that no matter how many minutes (time), only 60 seconds will be limited options.MapEffectPolicy(LimitPolicy.Minute, (now, tick) => return 60;); // Means that no matter how many minutes (time), only 60 seconds will be limited
}); });
} }
} }

2
aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/README.md

@ -80,7 +80,7 @@ public class YouProjectModule : AbpModule
{ {
Configure<AbpFeaturesLimitValidationOptions>(options => Configure<AbpFeaturesLimitValidationOptions>(options =>
{ {
options.MapEffectPolicy(LimitPolicy.Minute, (time) => return 60;); // 表示不管多少分钟(time),都只会限制60秒 options.MapEffectPolicy(LimitPolicy.Minute, (now, tick) => return 60;); // 表示不管多少分钟(time),都只会限制60秒
}); });
} }
} }

5
aspnet-core/modules/notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/AbpNotificationsDomainModule.cs

@ -29,6 +29,11 @@ public class AbpNotificationsDomainModule : AbpModule
options.IsDynamicNotificationsStoreEnabled = false; options.IsDynamicNotificationsStoreEnabled = false;
}); });
} }
Configure<AbpAutoMapperOptions>(options =>
{
options.AddProfile<AbpNotificationsDomainAutoMapperProfile>(validate: true);
});
} }
public override void OnApplicationInitialization(ApplicationInitializationContext context) public override void OnApplicationInitialization(ApplicationInitializationContext context)

16
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Features/AbpOssManagementFeatureDefinitionProvider.cs

@ -20,45 +20,45 @@ namespace LINGYUN.Abp.OssManagement.Features
description: L("Features:Description:PublicAccess"), description: L("Features:Description:PublicAccess"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
var ossFeature = featureGroup.AddFeature( var ossDefaultFeature = featureGroup.AddFeature(
name: AbpOssManagementFeatureNames.OssObject.Default, name: AbpOssManagementFeatureNames.OssObject.Enable,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:DisplayName:OssObject"), displayName: L("Features:DisplayName:OssObject"),
description: L("Features:Description:OssObject"), description: L("Features:Description:OssObject"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
ossFeature.CreateChild( ossDefaultFeature.CreateChild(
name: AbpOssManagementFeatureNames.OssObject.DownloadFile, name: AbpOssManagementFeatureNames.OssObject.DownloadFile,
defaultValue: false.ToString(), defaultValue: false.ToString(),
displayName: L("Features:DisplayName:DownloadFile"), displayName: L("Features:DisplayName:DownloadFile"),
description: L("Features:Description:DownloadFile"), description: L("Features:Description:DownloadFile"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
ossFeature.CreateChild( ossDefaultFeature.CreateChild(
name: AbpOssManagementFeatureNames.OssObject.DownloadLimit, name: AbpOssManagementFeatureNames.OssObject.DownloadLimit,
defaultValue: "1000", defaultValue: "1000",
displayName: L("Features:DisplayName:DownloadLimit"), displayName: L("Features:DisplayName:DownloadLimit"),
description: L("Features:Description:DownloadLimit"), description: L("Features:Description:DownloadLimit"),
valueType: new FreeTextStringValueType(new NumericValueValidator(0, 100_0000))); // 上限100万次调用 valueType: new FreeTextStringValueType(new NumericValueValidator(0, 100_0000))); // 上限100万次调用
ossFeature.CreateChild( ossDefaultFeature.CreateChild(
name: AbpOssManagementFeatureNames.OssObject.DownloadInterval, name: AbpOssManagementFeatureNames.OssObject.DownloadInterval,
defaultValue: "1", defaultValue: "1",
displayName: L("Features:DisplayName:DownloadInterval"), displayName: L("Features:DisplayName:DownloadInterval"),
description: L("Features:Description:DownloadInterval"), description: L("Features:Description:DownloadInterval"),
valueType: new FreeTextStringValueType(new NumericValueValidator(1, 12))); // 上限12月 valueType: new FreeTextStringValueType(new NumericValueValidator(1, 12))); // 上限12月
ossFeature.CreateChild( ossDefaultFeature.CreateChild(
name: AbpOssManagementFeatureNames.OssObject.UploadFile, name: AbpOssManagementFeatureNames.OssObject.UploadFile,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:DisplayName:UploadFile"), displayName: L("Features:DisplayName:UploadFile"),
description: L("Features:Description:UploadFile"), description: L("Features:Description:UploadFile"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
ossFeature.CreateChild( ossDefaultFeature.CreateChild(
name: AbpOssManagementFeatureNames.OssObject.UploadLimit, name: AbpOssManagementFeatureNames.OssObject.UploadLimit,
defaultValue: "1000", defaultValue: "1000",
displayName: L("Features:DisplayName:UploadLimit"), displayName: L("Features:DisplayName:UploadLimit"),
description: L("Features:Description:UploadLimit"), description: L("Features:Description:UploadLimit"),
valueType: new FreeTextStringValueType(new NumericValueValidator(0, 100_0000))); // 上限100万次调用 valueType: new FreeTextStringValueType(new NumericValueValidator(0, 100_0000))); // 上限100万次调用
ossFeature.CreateChild( ossDefaultFeature.CreateChild(
name: AbpOssManagementFeatureNames.OssObject.UploadInterval, name: AbpOssManagementFeatureNames.OssObject.UploadInterval,
defaultValue: "1", defaultValue: "1",
displayName: L("Features:DisplayName:UploadInterval"), displayName: L("Features:DisplayName:UploadInterval"),

2
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Features/AbpOssManagementFeatureNames.cs

@ -11,6 +11,8 @@
public class OssObject public class OssObject
{ {
public const string Default = GroupName + ".OssObject"; public const string Default = GroupName + ".OssObject";
public const string Enable = Default + ".Enable";
/// <summary> /// <summary>
/// 下载文件功能 /// 下载文件功能
/// </summary> /// </summary>

72
aspnet-core/modules/pushplus/LINGYUN.Abp.PushPlus/LINGYUN/Abp/PushPlus/Features/PushPlusFeatureDefinitionProvider.cs

@ -12,40 +12,36 @@ public class PushPlusFeatureDefinitionProvider : FeatureDefinitionProvider
name: PushPlusFeatureNames.GroupName, name: PushPlusFeatureNames.GroupName,
displayName: L("Features:PushPlus")); displayName: L("Features:PushPlus"));
group.AddFeature( var pushPlusMessageEnableFeature = group.AddFeature(
name: PushPlusFeatureNames.Message.Enable, name: PushPlusFeatureNames.Message.Enable,
defaultValue: "false", defaultValue: "false",
displayName: L("Features:MessageEnable"), displayName: L("Features:MessageEnable"),
description: L("Features:MessageEnableDesc"), description: L("Features:MessageEnableDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
CreateWeChatChannelFeature(group); CreateWeChatChannelFeature(pushPlusMessageEnableFeature);
CreateWeWorkChannelFeature(group); CreateWeWorkChannelFeature(pushPlusMessageEnableFeature);
CreateWebhookChannelFeature(group); CreateWebhookChannelFeature(pushPlusMessageEnableFeature);
CreateEmailChannelFeature(group); CreateEmailChannelFeature(pushPlusMessageEnableFeature);
CreateSmsChannelFeature(group); CreateSmsChannelFeature(pushPlusMessageEnableFeature);
} }
private static void CreateWeChatChannelFeature( private static void CreateWeChatChannelFeature(
FeatureGroupDefinition group) FeatureDefinition pushPlusMessageEnableFeature)
{ {
var weChatChannel = group.AddFeature( var weChatChannelEnableFeature = pushPlusMessageEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.WeChat.GroupName,
displayName: L("Features:Channel.WeChat"),
description: L("Features:Channel.WeChat"));
weChatChannel.CreateChild(
name: PushPlusFeatureNames.Channel.WeChat.Enable, name: PushPlusFeatureNames.Channel.WeChat.Enable,
defaultValue: "false", defaultValue: "false",
displayName: L("Features:Channel.WeChat.Enable"), displayName: L("Features:Channel.WeChat.Enable"),
description: L("Features:Channel.WeChat.EnableDesc"), description: L("Features:Channel.WeChat.EnableDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
weChatChannel.CreateChild( weChatChannelEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.WeChat.SendLimit, name: PushPlusFeatureNames.Channel.WeChat.SendLimit,
defaultValue: "200", defaultValue: "200",
displayName: L("Features:Channel.WeChat.SendLimit"), displayName: L("Features:Channel.WeChat.SendLimit"),
description: L("Features:Channel.WeChat.SendLimitDesc"), description: L("Features:Channel.WeChat.SendLimitDesc"),
valueType: new FreeTextStringValueType(new NumericValueValidator(1, 1000))); valueType: new FreeTextStringValueType(new NumericValueValidator(1, 1000)));
weChatChannel.CreateChild( weChatChannelEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.WeChat.SendLimitInterval, name: PushPlusFeatureNames.Channel.WeChat.SendLimitInterval,
defaultValue: "1", defaultValue: "1",
displayName: L("Features:Channel.WeChat.SendLimitInterval"), displayName: L("Features:Channel.WeChat.SendLimitInterval"),
@ -54,25 +50,21 @@ public class PushPlusFeatureDefinitionProvider : FeatureDefinitionProvider
} }
private static void CreateWeWorkChannelFeature( private static void CreateWeWorkChannelFeature(
FeatureGroupDefinition group) FeatureDefinition pushPlusMessageEnableFeature)
{ {
var weWorkChannel = group.AddFeature( var weWorkChannelEnableFeature = pushPlusMessageEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.WeWork.GroupName,
displayName: L("Features:Channel.WeWork"),
description: L("Features:Channel.WeWork"));
weWorkChannel.CreateChild(
name: PushPlusFeatureNames.Channel.WeWork.Enable, name: PushPlusFeatureNames.Channel.WeWork.Enable,
defaultValue: "false", defaultValue: "false",
displayName: L("Features:Channel.WeWork.Enable"), displayName: L("Features:Channel.WeWork.Enable"),
description: L("Features:Channel.WeWork.EnableDesc"), description: L("Features:Channel.WeWork.EnableDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
weWorkChannel.CreateChild( weWorkChannelEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.WeWork.SendLimit, name: PushPlusFeatureNames.Channel.WeWork.SendLimit,
defaultValue: "200", defaultValue: "200",
displayName: L("Features:Channel.WeWork.SendLimit"), displayName: L("Features:Channel.WeWork.SendLimit"),
description: L("Features:Channel.WeWork.SendLimitDesc"), description: L("Features:Channel.WeWork.SendLimitDesc"),
valueType: new FreeTextStringValueType(new NumericValueValidator(1, 10000))); valueType: new FreeTextStringValueType(new NumericValueValidator(1, 10000)));
weWorkChannel.CreateChild( weWorkChannelEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.WeWork.SendLimitInterval, name: PushPlusFeatureNames.Channel.WeWork.SendLimitInterval,
defaultValue: "1", defaultValue: "1",
displayName: L("Features:Channel.WeWork.SendLimitInterval"), displayName: L("Features:Channel.WeWork.SendLimitInterval"),
@ -81,25 +73,21 @@ public class PushPlusFeatureDefinitionProvider : FeatureDefinitionProvider
} }
private static void CreateWebhookChannelFeature( private static void CreateWebhookChannelFeature(
FeatureGroupDefinition group) FeatureDefinition pushPlusMessageEnableFeature)
{ {
var webhookChannel = group.AddFeature( var webhookChannelEnableFeatuer = pushPlusMessageEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.Webhook.GroupName,
displayName: L("Features:Channel.Webhook"),
description: L("Features:Channel.Webhook"));
webhookChannel.CreateChild(
name: PushPlusFeatureNames.Channel.Webhook.Enable, name: PushPlusFeatureNames.Channel.Webhook.Enable,
defaultValue: "false", defaultValue: "false",
displayName: L("Features:Channel.Webhook.Enable"), displayName: L("Features:Channel.Webhook.Enable"),
description: L("Features:Channel.Webhook.EnableDesc"), description: L("Features:Channel.Webhook.EnableDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
webhookChannel.CreateChild( webhookChannelEnableFeatuer.CreateChild(
name: PushPlusFeatureNames.Channel.Webhook.SendLimit, name: PushPlusFeatureNames.Channel.Webhook.SendLimit,
defaultValue: "200", defaultValue: "200",
displayName: L("Features:Channel.Webhook.SendLimit"), displayName: L("Features:Channel.Webhook.SendLimit"),
description: L("Features:Channel.Webhook.SendLimitDesc"), description: L("Features:Channel.Webhook.SendLimitDesc"),
valueType: new FreeTextStringValueType(new NumericValueValidator(1, 10000))); valueType: new FreeTextStringValueType(new NumericValueValidator(1, 10000)));
webhookChannel.CreateChild( webhookChannelEnableFeatuer.CreateChild(
name: PushPlusFeatureNames.Channel.Webhook.SendLimitInterval, name: PushPlusFeatureNames.Channel.Webhook.SendLimitInterval,
defaultValue: "1", defaultValue: "1",
displayName: L("Features:Channel.Webhook.SendLimitInterval"), displayName: L("Features:Channel.Webhook.SendLimitInterval"),
@ -108,25 +96,21 @@ public class PushPlusFeatureDefinitionProvider : FeatureDefinitionProvider
} }
private static void CreateEmailChannelFeature( private static void CreateEmailChannelFeature(
FeatureGroupDefinition group) FeatureDefinition pushPlusMessageEnableFeature)
{ {
var emailChannel = group.AddFeature( var emailChannelEnableFeature = pushPlusMessageEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.Email.GroupName,
displayName: L("Features:Channel.Email"),
description: L("Features:Channel.Email"));
emailChannel.CreateChild(
name: PushPlusFeatureNames.Channel.Email.Enable, name: PushPlusFeatureNames.Channel.Email.Enable,
defaultValue: "false", defaultValue: "false",
displayName: L("Features:Channel.Email.Enable"), displayName: L("Features:Channel.Email.Enable"),
description: L("Features:Channel.Email.EnableDesc"), description: L("Features:Channel.Email.EnableDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
emailChannel.CreateChild( emailChannelEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.Email.SendLimit, name: PushPlusFeatureNames.Channel.Email.SendLimit,
defaultValue: "200", defaultValue: "200",
displayName: L("Features:Channel.Email.SendLimit"), displayName: L("Features:Channel.Email.SendLimit"),
description: L("Features:Channel.Email.SendLimitDesc"), description: L("Features:Channel.Email.SendLimitDesc"),
valueType: new FreeTextStringValueType(new NumericValueValidator(1, 1000))); valueType: new FreeTextStringValueType(new NumericValueValidator(1, 1000)));
emailChannel.CreateChild( emailChannelEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.Email.SendLimitInterval, name: PushPlusFeatureNames.Channel.Email.SendLimitInterval,
defaultValue: "1", defaultValue: "1",
displayName: L("Features:Channel.Email.SendLimitInterval"), displayName: L("Features:Channel.Email.SendLimitInterval"),
@ -135,25 +119,21 @@ public class PushPlusFeatureDefinitionProvider : FeatureDefinitionProvider
} }
private static void CreateSmsChannelFeature( private static void CreateSmsChannelFeature(
FeatureGroupDefinition group) FeatureDefinition pushPlusMessageEnableFeature)
{ {
var smsChannel = group.AddFeature( var smsChannelEnableFeature = pushPlusMessageEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.Sms.GroupName,
displayName: L("Features:Channel.Sms"),
description: L("Features:Channel.Sms"));
smsChannel.CreateChild(
name: PushPlusFeatureNames.Channel.Sms.Enable, name: PushPlusFeatureNames.Channel.Sms.Enable,
defaultValue: "false", defaultValue: "false",
displayName: L("Features:Channel.Sms.Enable"), displayName: L("Features:Channel.Sms.Enable"),
description: L("Features:Channel.Sms.EnableDesc"), description: L("Features:Channel.Sms.EnableDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
smsChannel.CreateChild( smsChannelEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.Sms.SendLimit, name: PushPlusFeatureNames.Channel.Sms.SendLimit,
defaultValue: "200", defaultValue: "200",
displayName: L("Features:Channel.Sms.SendLimit"), displayName: L("Features:Channel.Sms.SendLimit"),
description: L("Features:Channel.Sms.SendLimitDesc"), description: L("Features:Channel.Sms.SendLimitDesc"),
valueType: new FreeTextStringValueType(new NumericValueValidator(1, 1000))); valueType: new FreeTextStringValueType(new NumericValueValidator(1, 1000)));
smsChannel.CreateChild( smsChannelEnableFeature.CreateChild(
name: PushPlusFeatureNames.Channel.Sms.SendLimitInterval, name: PushPlusFeatureNames.Channel.Sms.SendLimitInterval,
defaultValue: "1", defaultValue: "1",
displayName: L("Features:Channel.Sms.SendLimitInterval"), displayName: L("Features:Channel.Sms.SendLimitInterval"),

23
aspnet-core/modules/wechat/LINGYUN.Abp.WeChat.MiniProgram/LINGYUN/Abp/WeChat/MiniProgram/Features/WeChatMiniProgramFeatureDefinitionProvider.cs

@ -12,18 +12,18 @@ namespace LINGYUN.Abp.WeChat.MiniProgram.Features
{ {
var group = context.GetGroupOrNull(WeChatFeatures.GroupName); var group = context.GetGroupOrNull(WeChatFeatures.GroupName);
var miniProgram = group.AddFeature( //var miniProgram = group.AddFeature(
name: WeChatMiniProgramFeatures.GroupName, // name: WeChatMiniProgramFeatures.GroupName,
displayName: L("Features:WeChat.MiniProgram"), // displayName: L("Features:WeChat.MiniProgram"),
description: L("Features:WeChat.MiniProgramDesc")); // description: L("Features:WeChat.MiniProgramDesc"));
miniProgram.CreateChild( var miniProgramEnableFeature = group.AddFeature(
name: WeChatMiniProgramFeatures.Enable, name: WeChatMiniProgramFeatures.Enable,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:WeChat.MiniProgram.Enable"), displayName: L("Features:WeChat.MiniProgram.Enable"),
description: L("Features:WeChat.MiniProgram.EnableDesc"), description: L("Features:WeChat.MiniProgram.EnableDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
miniProgram.CreateChild( miniProgramEnableFeature.CreateChild(
name: WeChatMiniProgramFeatures.EnableAuthorization, name: WeChatMiniProgramFeatures.EnableAuthorization,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:WeChat.MiniProgram.EnableAuthorization"), displayName: L("Features:WeChat.MiniProgram.EnableAuthorization"),
@ -31,24 +31,19 @@ namespace LINGYUN.Abp.WeChat.MiniProgram.Features
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
var message = miniProgram.CreateChild( var messageEnableFeature = group.AddFeature(
name: WeChatMiniProgramFeatures.Messages.Default,
displayName: L("Features:WeChat.MiniProgram.Messages"),
description: L("Features:WeChat.MiniProgram.MessagesDesc"));
message.CreateChild(
name: WeChatMiniProgramFeatures.Messages.Enable, name: WeChatMiniProgramFeatures.Messages.Enable,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:WeChat.MiniProgram.EnableMessages"), displayName: L("Features:WeChat.MiniProgram.EnableMessages"),
description: L("Features:WeChat.MiniProgram.EnableMessagesDesc"), description: L("Features:WeChat.MiniProgram.EnableMessagesDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
message.CreateChild( messageEnableFeature.CreateChild(
name: WeChatMiniProgramFeatures.Messages.SendLimit, name: WeChatMiniProgramFeatures.Messages.SendLimit,
defaultValue: WeChatMiniProgramFeatures.Messages.DefaultSendLimit.ToString(), defaultValue: WeChatMiniProgramFeatures.Messages.DefaultSendLimit.ToString(),
displayName: L("Features:WeChat.MiniProgram.SendLimit"), displayName: L("Features:WeChat.MiniProgram.SendLimit"),
description: L("Features:WeChat.MiniProgram.SendLimitDesc"), description: L("Features:WeChat.MiniProgram.SendLimitDesc"),
valueType: new FreeTextStringValueType(new NumericValueValidator(1, 100_0000))); valueType: new FreeTextStringValueType(new NumericValueValidator(1, 100_0000)));
message.CreateChild( messageEnableFeature.CreateChild(
name: WeChatMiniProgramFeatures.Messages.SendLimitInterval, name: WeChatMiniProgramFeatures.Messages.SendLimitInterval,
defaultValue: WeChatMiniProgramFeatures.Messages.DefaultSendLimitInterval.ToString(), defaultValue: WeChatMiniProgramFeatures.Messages.DefaultSendLimitInterval.ToString(),
displayName: L("Features:WeChat.MiniProgram.SendLimitInterval"), displayName: L("Features:WeChat.MiniProgram.SendLimitInterval"),

10
aspnet-core/modules/wechat/LINGYUN.Abp.WeChat.Official/LINGYUN/Abp/WeChat/Official/Features/WeChatOfficialFeatureDefinitionProvider.cs

@ -12,18 +12,14 @@ namespace LINGYUN.Abp.WeChat.Official.Features
{ {
var group = context.GetGroupOrNull(WeChatFeatures.GroupName); var group = context.GetGroupOrNull(WeChatFeatures.GroupName);
var official = group.AddFeature( var officialEnableFeature = group.AddFeature(
name: WeChatOfficialFeatures.GroupName,
displayName: L("Features:WeChat.Official"),
description: L("Features:WeChat.OfficialDesc"));
official.CreateChild(
name: WeChatOfficialFeatures.Enable, name: WeChatOfficialFeatures.Enable,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:WeChat.Official.Enable"), displayName: L("Features:WeChat.Official.Enable"),
description: L("Features:WeChat.Official.EnableDesc"), description: L("Features:WeChat.Official.EnableDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
official.CreateChild(
officialEnableFeature.CreateChild(
name: WeChatOfficialFeatures.EnableAuthorization, name: WeChatOfficialFeatures.EnableAuthorization,
defaultValue: true.ToString(), defaultValue: true.ToString(),
displayName: L("Features:WeChat.Official.EnableAuthorization"), displayName: L("Features:WeChat.Official.EnableAuthorization"),

14
aspnet-core/modules/wx-pusher/LINGYUN.Abp.WxPusher/LINGYUN/Abp/WxPusher/Features/WxPusherFeatureDefinitionProvider.cs

@ -12,31 +12,27 @@ public class WxPusherFeatureDefinitionProvider : FeatureDefinitionProvider
var group = context.AddGroup( var group = context.AddGroup(
name: WxPusherFeatureNames.GroupName, name: WxPusherFeatureNames.GroupName,
displayName: L("Features:WxPusher")); displayName: L("Features:WxPusher"));
group.AddFeature(
var wxPusherEnableFeature = group.AddFeature(
name: WxPusherFeatureNames.Enable, name: WxPusherFeatureNames.Enable,
defaultValue: "false", defaultValue: "false",
displayName: L("Features:WxPusherEnable"), displayName: L("Features:WxPusherEnable"),
description: L("Features:WxPusherEnableDesc"), description: L("Features:WxPusherEnableDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
var message = group.AddFeature( var messageEnableFeature = wxPusherEnableFeature.CreateChild(
name: WxPusherFeatureNames.Message.GroupName,
displayName: L("Features:Message"),
description: L("Features:Message"));
message.CreateChild(
name: WxPusherFeatureNames.Message.Enable, name: WxPusherFeatureNames.Message.Enable,
defaultValue: "false", defaultValue: "false",
displayName: L("Features:MessageEnable"), displayName: L("Features:MessageEnable"),
description: L("Features:MessageEnableDesc"), description: L("Features:MessageEnableDesc"),
valueType: new ToggleStringValueType(new BooleanValueValidator())); valueType: new ToggleStringValueType(new BooleanValueValidator()));
message.CreateChild( messageEnableFeature.CreateChild(
name: WxPusherFeatureNames.Message.SendLimit, name: WxPusherFeatureNames.Message.SendLimit,
defaultValue: "500", defaultValue: "500",
displayName: L("Features:Message.SendLimit"), displayName: L("Features:Message.SendLimit"),
description: L("Features:Message.SendLimitDesc"), description: L("Features:Message.SendLimitDesc"),
valueType: new FreeTextStringValueType(new NumericValueValidator(1, 500))); valueType: new FreeTextStringValueType(new NumericValueValidator(1, 500)));
message.CreateChild( messageEnableFeature.CreateChild(
name: WxPusherFeatureNames.Message.SendLimitInterval, name: WxPusherFeatureNames.Message.SendLimitInterval,
defaultValue: "1", defaultValue: "1",
displayName: L("Features:Message.SendLimitInterval"), displayName: L("Features:Message.SendLimitInterval"),

Loading…
Cancel
Save